Load and plot the phylogeny

Example 1: without a time axis.

Example 2: with a “classic” time axis.

Example 3: a fully bifucating version with different text sizes for time

Distinguish speciation modes

Fully bifurcating tree

Budding/bifurcating tree

Observed origination and extinction rates

Transformations

Extract smaller trees

Update some phylogenetic placements

Lineage N150 (Paragloborotalia pseudokugleri-Paragloborotalia kugleri) has been placed by Aze et al. in the Non-Spinose group, but has been confirmed recently within the Paragloborotalia genus, as a likely descendent of Paragloborotalia nana (Leckie et al. 2018, https://www.mikrotax.org/pforams/index.php?id=104347).

Add fossils

New function to add fossils

Match fossil species in Triton and lineages in the tree

  [1] "Hedbergella holmdelensis"                                                                                                                               
  [2] "Morozovella praeangulata-Morozovella angulata"                                                                                                          
  [3] "Acarinina subsphaerica"                                                                                                                                 
  [4] "Acarinina mckannai-Acarinina soldadoensis"                                                                                                              
  [5] "Acarinina esnehensis"                                                                                                                                   
  [6] "Acarinina sibaiyaensis"                                                                                                                                 
  [7] "Acarinina soldadoensis"                                                                                                                                 
  [8] "Acarinina interposita-Acarinina pentacamerata"                                                                                                          
  [9] "Acarinina pentacamerata-Acarinina collactea"                                                                                                            
 [10] "Acarinina soldadoensis"                                                                                                                                 
 [11] "Acarinina soldadoensis"                                                                                                                                 
 [12] "Acarinina alticonica-Acarinina pseudosubsphaerica"                                                                                                      
 [13] "Hirsutella scitula"                                                                                                                                     
 [14] "Acarinina nitida"                                                                                                                                       
 [15] "Acarinina coalingensis-Acarinina primitiva"                                                                                                             
 [16] "Acarinina esnaensis-Acarinina wilcoxensis"                                                                                                              
 [17] "Globanomalina australiformis"                                                                                                                           
 [18] "Acarinina pseudotopilensis"                                                                                                                             
 [19] "Acarinina pseudotopilensis"                                                                                                                             
 [20] "Acarinina boudreauxi-Acarinina bullbrooki"                                                                                                              
 [21] "Acarinina praetopilensis-Acarinina mcgowrani"                                                                                                           
 [22] "Morozovelloides bandyi-Morozovelloides coronatus-Morozovelloides crassatus"                                                                             
 [23] "Morozovelloides bandyi-Morozovelloides coronatus-Morozovelloides crassatus"                                                                             
 [24] "Acarinina praetopilensis"                                                                                                                               
 [25] "Acarinina praetopilensis-Acarinina topilensis"                                                                                                          
 [26] "Acarinina topilensis"                                                                                                                                   
 [27] "Dentoglobigerina galavisi"                                                                                                                              
 [28] "Turborotalia frontosa-Turborotalia possagnoensis-Turborotalia pomeroli-Turborotalia cerroazulensis-Turborotalia altispiroides"                          
 [29] "Paragloborotalia pseudokugleri-Paragloborotalia kugleri"                                                                                                
 [30] "Paragloborotalia nana"                                                                                                                                  
 [31] "Fohsella peripheroronda-Fohsella birnageae-Fohsella peripheroacuta-Fohsella praefohsi"                                                                  
 [32] "Neogloboquadrina continuosa"                                                                                                                            
 [33] "Neogloboquadrina continuosa-Neogloboquadrina acostaensis"                                                                                               
 [34] "Neogloboquadrina continuosa-Neogloboquadrina acostaensis"                                                                                               
 [35] "Dentoglobigerina galavisi"                                                                                                                              
 [36] "Dentoglobigerina sp-Dentoglobigerina galavisi-Dentoglobigerina tapuriensis"                                                                             
 [37] "Dentoglobigerina tapuriensis"                                                                                                                           
 [38] "Dentoglobigerina sellii"                                                                                                                                
 [39] "Turborotalia pomeroli-Turborotalia increbescens-Turborotalia cerroazulensis"                                                                            
 [40] "Dentoglobigerina galavisi"                                                                                                                              
 [41] "Dentoglobigerina prasaepis-Dentoglobigerina venezuelana-Globoquadrina conglomerata"                                                                     
 [42] "Dentoglobigerina galavisi"                                                                                                                              
 [43] "Dentoglobigerina galavisi"                                                                                                                              
 [44] "Dentoglobigerina larmeui"                                                                                                                               
 [45] "Turborotalia pomeroli-Turborotalia cerroazulensis"                                                                                                      
 [46] "Parasubbotina aff_pseudobulloides-Parasubbotina varianta"                                                                                               
 [47] "Parasubbotina varianta"                                                                                                                                 
 [48] "Parasubbotina varianta"                                                                                                                                 
 [49] "Parasubbotina varianta"                                                                                                                                 
 [50] "Parasubbotina varianta"                                                                                                                                 
 [51] "Globorotaloides quadrocameratus"                                                                                                                        
 [52] "Paragloborotalia griffinoides"                                                                                                                          
 [53] "Paragloborotalia nana"                                                                                                                                  
 [54] "Paragloborotalia nana"                                                                                                                                  
 [55] "Hedbergella monmouthensis"                                                                                                                              
 [56] "Globorotaloides quadrocameratus"                                                                                                                        
 [57] "Hedbergella monmouthensis"                                                                                                                              
 [58] "Globorotaloides eovariabilis"                                                                                                                           
 [59] "Globorotaloides hexagonus"                                                                                                                              
 [60] "Catapsydrax unicavus"                                                                                                                                   
 [61] "Catapsydrax howei"                                                                                                                                      
 [62] "Turborotalia increbescens-Turborotalia ampliapertura"                                                                                                   
 [63] "Catapsydrax unicavus"                                                                                                                                   
 [64] "Catapsydrax unicavus-Catapsydrax dissimilis"                                                                                                            
 [65] "Parasubbotina inaequispira"                                                                                                                             
 [66] "Parasubbotina inaequispira"                                                                                                                             
 [67] "Parasubbotina eoclava"                                                                                                                                  
 [68] "Clavigerinella eocanica"                                                                                                                                
 [69] "Clavigerinella eocanica"                                                                                                                                
 [70] "Clavigerinella caucasica-Hantkenina singanoae-Hantkenina mexicana-Hantkenina lehneri-Hantkenina liebusi"                                                
 [71] "Hantkenina liebusi-Hantkenina dumblei"                                                                                                                  
 [72] "Hantkenina dumblei-Hantkenina compressa-Hantkenina primitiva"                                                                                           
 [73] "Neogloboquadrina continuosa"                                                                                                                            
 [74] "Parasubbotina inaequispira"                                                                                                                             
 [75] "Parasubbotina griffinae"                                                                                                                                
 [76] "Parasubbotina inaequispira"                                                                                                                             
 [77] "Guembelitrioides nuttalli"                                                                                                                              
 [78] "Globigerinatheka subconglobata"                                                                                                                         
 [79] "Globigerinatheka subconglobata"                                                                                                                         
 [80] "Globigerinatheka mexicana"                                                                                                                              
 [81] "Globigerinatheka subconglobata"                                                                                                                         
 [82] "Globigerinatheka subconglobata"                                                                                                                         
 [83] "Globigerinatheka index"                                                                                                                                 
 [84] "Hirsutella praescitula-Globorotalia zealandica"                                                                                                         
 [85] "Globigerinatheka kugleri"                                                                                                                               
 [86] "Globigerinatheka curryi-Globigerinatheka euganea"                                                                                                       
 [87] "Hedbergella monmouthensis"                                                                                                                              
 [88] "Eoglobigerina eobulloides"                                                                                                                              
 [89] "Subbotina trivialis"                                                                                                                                    
 [90] "Hirsutella praescitula-Globorotalia zealandica"                                                                                                         
 [91] "Subbotina trivialis"                                                                                                                                    
 [92] "Subbotina trivialis-Subbotina triangularis"                                                                                                             
 [93] "Subbotina roesnaesensis"                                                                                                                                
 [94] "Subbotina roesnaesensis"                                                                                                                                
 [95] "Subbotina eocaena"                                                                                                                                      
 [96] "Subbotina eocaena"                                                                                                                                      
 [97] "Globoconella miozea-Globoconella conoidea-Globoconella conomiozea-Globoconella terminalis"                                                              
 [98] "Subbotina eocaena"                                                                                                                                      
 [99] "Subbotina sp1"                                                                                                                                          
[100] "Subbotina roesnaesensis"                                                                                                                                
[101] "Subbotina roesnaesensis-Globigerina officinalis"                                                                                                        
[102] "Globigerina ciperoensis"                                                                                                                                
[103] "Globigerina officinalis-Globigerina praebulloides"                                                                                                      
[104] "Globigerina officinalis-Globigerina praebulloides"                                                                                                      
[105] "Globigerina praebulloides"                                                                                                                              
[106] "Globigerina praebulloides"                                                                                                                              
[107] "Globigerina eamesi"                                                                                                                                     
[108] "Beella praedigitata-Beella digitata-Beella megastoma"                                                                                                   
[109] "Globorotaloides eovariabilis"                                                                                                                           
[110] "Globigerinella obesa-Globigerinella praesiphonifera-Globigerinella siphonifera"                                                                         
[111] "Hedbergella holmdelensis-Globanomalina archeocompressa-Globanomalina planocompressa"                                                                    
[112] "Menardella archeomenardii"                                                                                                                              
[113] "Globigerinella siphonifera"                                                                                                                             
[114] "Globigerinella calida"                                                                                                                                  
[115] "Subbotina cancellata"                                                                                                                                   
[116] "Subbotina velascoensis"                                                                                                                                 
[117] "Subbotina hornibrooki"                                                                                                                                  
[118] "Subbotina cancellata-Subbotina patagonica-Subbotina linaperta"                                                                                          
[119] "Globoturborotalita bassriverensis"                                                                                                                      
[120] "Turborotalita carcoselleensis-Turborotalita praequinqueloba-Turborotalita quinqueloba"                                                                  
[121] "Globoturborotalita bassriverensis"                                                                                                                      
[122] "Globoturborotalita ouachitaensis"                                                                                                                       
[123] "Hirsutella praescitula"                                                                                                                                 
[124] "Globoturborotalita martini"                                                                                                                             
[125] "Globoturborotalita woodi"                                                                                                                               
[126] "Globoturborotalita brazieri"                                                                                                                            
[127] "Globigerinoides subquadratus"                                                                                                                           
[128] "Globigerinoides altiapertura-Globigerinoides obliquus"                                                                                                  
[129] "Globigerinoides obliquus"                                                                                                                               
[130] "Globigerinoides subquadratus"                                                                                                                           
[131] "Globigerinoides subquadratus-Globigerinoides diminutus"                                                                                                 
[132] "Globoturborotalita woodi"                                                                                                                               
[133] "Globoturborotalita connecta-Globigerinoides trilobus"                                                                                                   
[134] "Globigerinoides trilobus-Globigerinoides sacculifer"                                                                                                    
[135] "Menardella praemenardii-Menardella menardii"                                                                                                            
[136] "Globoturborotalita woodi"                                                                                                                               
[137] "Globoturborotalita woodi"                                                                                                                               
[138] "Sphaeroidinellopsis disjuncta-Sphaeroidinellopsis seminulina"                                                                                           
[139] "Globoturborotalita woodi"                                                                                                                               
[140] "Globoturborotalita decoraperta-Globoturborotalita rubescens-Globoturborotalita tenella"                                                                 
[141] "Menardella limbata"                                                                                                                                     
[142] "Globoturborotalita woodi"                                                                                                                               
[143] "Globoturborotalita woodi"                                                                                                                               
[144] "Hantkenina alabamensis"                                                                                                                                 
[145] "Pulleniatina primalis-Pulleniatina praecursor-Pulleniatina obliquiloculata"                                                                             
[146] "Globigerinella obesa-Globigerinella praesiphonifera-Globigerinella siphonifera"                                                                         
[147] "Morozovella velascoensis"                                                                                                                               
[148] "Menardella limbata"                                                                                                                                     
[149] "Morozovella velascoensis"                                                                                                                               
[150] "Globanomalina compressa-Globanomalina ehrenbergi"                                                                                                       
[151] "Menardella menardii"                                                                                                                                    
[152] "Globorotalia merotumida-Globorotalia plesiotumida"                                                                                                      
[153] "Globorotalia tumida-Globorotalia flexuosa"                                                                                                              
[154] "Hirsutella scitula-Hirsutella gigantea"                                                                                                                 
[155] "Hirsutella praemargaritae-Hirsutella primitiva-Hirsutella evoluta-Hirsutella margaritae"                                                                
[156] "Globanomalina planocompressa-Globanomalina imitata-Globanomalina ovalis"                                                                                
[157] "Hirsutella scitula-Hirsutella gigantea"                                                                                                                 
[158] "Hirsutella cibaoensis"                                                                                                                                  
[159] "Hirsutella cibaoensis"                                                                                                                                  
[160] "Truncorotalia crassaformis"                                                                                                                             
[161] "Truncorotalia crassaformis-Truncorotalia oceanica-Truncorotalia ronda"                                                                                  
[162] "Truncorotalia crassaformis-Truncorotalia viola-Truncorotalia oceanica-Truncorotalia ronda"                                                              
[163] "Globanomalina ovalis-Globanomalina luxorensis-Pseudohastigerina wilcoxensis"                                                                            
[164] "Truncorotalia tenuitheca-Truncorotalia tosaensis"                                                                                                       
[165] "Truncorotalia truncatulinoides"                                                                                                                         
[166] "Praemurica taurica-Praemurica pseudoinconstans-Praemurica inconstans-Praemurica uncinata"                                                               
[167] "Praemurica uncinata"                                                                                                                                    
[168] "Praemurica uncinata"                                                                                                                                    
[169] "Igorina pusilla"                                                                                                                                        
[170] "Morozovella praeangulata-Morozovella angulata"                                                                                                          
[171] "Subbotina yeguaensis-Subbotina gortanii"                                                                                                                
[172] "Morozovella occlusa-Morozovella pasionensis-Morozovella acutispira"                                                                                     
[173] "Pseudohastigerina wilcoxensis-Pseudohastigerina micra"                                                                                                  
[174] "Morozovella conicotruncata-Morozovella velascoensis"                                                                                                    
[175] "Morozovella angulata-Morozovella apanthesma-Morozovella aequa"                                                                                          
[176] "Morozovella aequa"                                                                                                                                      
[177] "Planorotalites pseudoscitula-Planorotalites capdevilensis"                                                                                              
[178] "Morozovella subbotinae"                                                                                                                                 
[179] "Morozovella subbotinae"                                                                                                                                 
[180] "Morozovella subbotinae"                                                                                                                                 
[181] "Morozovella lensiformis"                                                                                                                                
[182] "Morozovella crater"                                                                                                                                     
[183] "Acarinina strabocella-Acarinina nitida"                                                                                                                 
[184] "Globorotaloides eovariabilis"                                                                                                                           
[185] "Pseudohastigerina naguewichiensis"                                                                                                                      
[186] "Acarinina subsphaerica"                                                                                                                                 
[187] "Acarinina esnehensis"                                                                                                                                   
[188] "Acarinina sibaiyaensis"                                                                                                                                 
[189] "Acarinina africana"                                                                                                                                     
[190] "Globanomalina pseudomenardii"                                                                                                                           
[191] "Acarinina aspensis"                                                                                                                                     
[192] "Acarinina collactea"                                                                                                                                    
[193] "Acarinina medizzai"                                                                                                                                     
[194] "Acarinina angulosa-Acarinina cuneicamerata"                                                                                                             
[195] "Acarinina soldadoensis"                                                                                                                                 
[196] "Globanomalina chapmani-Globanomalina planoconica-Planoglobanomalina pseudoalgeriana"                                                                    
[197] "Acarinina pseudosubsphaerica"                                                                                                                           
[198] "Acarinina echinata"                                                                                                                                     
[199] "Hirsutella scitula"                                                                                                                                     
[200] "Hirsutella bermudezi"                                                                                                                                   
[201] "Acarinina primitiva"                                                                                                                                    
[202] "Acarinina esnaensis-Acarinina wilcoxensis"                                                                                                              
[203] "Acarinina quetra"                                                                                                                                       
[204] "Acarinina punctocarinata"                                                                                                                               
[205] "Acarinina boudreauxi-Acarinina bullbrooki"                                                                                                              
[206] "Morozovelloides lehneri"                                                                                                                                
[207] "Globanomalina australiformis"                                                                                                                           
[208] "Acarinina mcgowrani"                                                                                                                                    
[209] "Morozovelloides bandyi"                                                                                                                                 
[210] "Morozovelloides coronatus-Morozovelloides crassatus"                                                                                                    
[211] "Acarinina topilensis"                                                                                                                                   
[212] "Acarinina rohri"                                                                                                                                        
[213] "Acarinina praetopilensis"                                                                                                                               
[214] "Paragloborotalia kugleri"                                                                                                                               
[215] "Fohsella fohsi-Fohsella lobata-Fohsella robusta"                                                                                                        
[216] "Fohsella paralenguaensis-Fohsella lenguaensis"                                                                                                          
[217] "Neogloboquadrina humerosa-Neogloboquadrina dutertrei"                                                                                                   
[218] "Neogloboquadrina pachyderma"                                                                                                                            
[219] "Turborotalia altispiroides"                                                                                                                             
[220] "Neogloboquadrina acostaensis"                                                                                                                           
[221] "Pulleniatina primalis-Pulleniatina praecursor-Pulleniatina obliquiloculata"                                                                             
[222] "Dentoglobigerina pseudovenezuelana"                                                                                                                     
[223] "Dentoglobigerina tapuriensis"                                                                                                                           
[224] "Dentoglobigerina sellii"                                                                                                                                
[225] "Dentoglobigerina binaiensis"                                                                                                                            
[226] "Dentoglobigerina rohri"                                                                                                                                 
[227] "Dentoglobigerina prasaepis-Dentoglobigerina venezuelana-Globoquadrina conglomerata"                                                                     
[228] "Dentoglobigerina globularis-Dentoglobigerina globosa-Dentoglobigerina altispira"                                                                        
[229] "Dentoglobigerina baroemoensis"                                                                                                                          
[230] "Dentoglobigerina larmeui"                                                                                                                               
[231] "Globoquadrina dehiscens"                                                                                                                                
[232] "Parasubbotina pseudobulloides"                                                                                                                          
[233] "Parasubbotina variospira"                                                                                                                               
[234] "Parasubbotina varianta-Parasubbotina pseudowilsoni"                                                                                                     
[235] "Turborotalia cerroazulensis"                                                                                                                            
[236] "Paragloborotalia griffinoides"                                                                                                                          
[237] "Paragloborotalia semivera-Paragloborotalia siakensis-Paragloborotalia bella-Paragloborotalia mayeri-Paragloborotalia acrostoma"                         
[238] "Paragloborotalia opima"                                                                                                                                 
[239] "Paragloborotalia nana-Paragloborotalia incognita"                                                                                                       
[240] "Turborotalia cocoaensis-Turborotalia cunialensis"                                                                                                       
[241] "Globorotaloides quadrocameratus"                                                                                                                        
[242] "Globorotaloides testarugosa"                                                                                                                            
[243] "Globorotaloides variabilis"                                                                                                                             
[244] "Globorotaloides eovariabilis-Globorotaloides hexagonus"                                                                                                 
[245] "Catapsydrax howei"                                                                                                                                      
[246] "Catapsydrax africanus"                                                                                                                                  
[247] "Catapsydrax globiformis"                                                                                                                                
[248] "Catapsydrax unicavus-Catapsydrax dissimilis"                                                                                                            
[249] "Catapsydrax stainforthi-Catapsydrax parvulus"                                                                                                           
[250] "Parasubbotina prebetica"                                                                                                                                
[251] "Parasubbotina eoclava"                                                                                                                                  
[252] "Turborotalia ampliapertura-Turborotalia euapertura"                                                                                                     
[253] "Clavigerinella akersi-Clavigerinella jarvisi-Clavigerinella colombiana"                                                                                 
[254] "Hantkenina lehneri"                                                                                                                                     
[255] "Hantkenina australis"                                                                                                                                   
[256] "Hantkenina compressa-Hantkenina primitiva"                                                                                                              
[257] "Hantkenina alabamensis"                                                                                                                                 
[258] "Hantkenina nanggulanensis-Cribrohantkenina inflata"                                                                                                     
[259] "Parasubbotina griffinae"                                                                                                                                
[260] "Pseudoglobigerinella bolivariana"                                                                                                                       
[261] "Parasubbotina inaequispira"                                                                                                                             
[262] "Guembelitrioides nuttalli"                                                                                                                              
[263] "Turborotalia increbescens"                                                                                                                              
[264] "Globigerinatheka mexicana"                                                                                                                              
[265] "Globigerinatheka semiinvoluta"                                                                                                                          
[266] "Globigerinatheka barri"                                                                                                                                 
[267] "Globigerinatheka subconglobata-Globigerinatheka korotkovi"                                                                                              
[268] "Globigerinatheka index"                                                                                                                                 
[269] "Globigerinatheka tropicalis"                                                                                                                            
[270] "Globigerinatheka kugleri"                                                                                                                               
[271] "Globigerinatheka euganea-Orbulinoides beckmanni"                                                                                                        
[272] "Globigerinatheka luterbacheri"                                                                                                                          
[273] "Eoglobigerina eobulloides-Eoglobigerina edita-Eoglobigerina spiralis"                                                                                   
[274] "Subbotina triloculinoides"                                                                                                                              
[275] "Subbotina triangularis"                                                                                                                                 
[276] "Subbotina yeguaensis-Subbotina gortanii"                                                                                                                
[277] "Subbotina hagni-Subbotina corpulenta"                                                                                                                   
[278] "Subbotina jacksonensis"                                                                                                                                 
[279] "Subbotina eocaena"                                                                                                                                      
[280] "Subbotina sp1"                                                                                                                                          
[281] "Subbotina sp2"                                                                                                                                          
[282] "Subbotina senni"                                                                                                                                        
[283] "Globoconella pliozea"                                                                                                                                   
[284] "Globigerina ciperoensis"                                                                                                                                
[285] "Globigerina angulisuturalis"                                                                                                                            
[286] "Globigerina officinalis"                                                                                                                                
[287] "Globigerinoides primordius"                                                                                                                             
[288] "Globigerina praebulloides-Globigerina bulloides-Globigerina umbilicata-Globigerina falconensis"                                                         
[289] "Globoconella sphericomiozea-Globoconella puncticulata-Globoconella inflata"                                                                             
[290] "Beella megastoma"                                                                                                                                       
[291] "Clavatorella bermudezi"                                                                                                                                 
[292] "Beella praedigitata-Beella digitata"                                                                                                                    
[293] "Globigerinella adamsi"                                                                                                                                  
[294] "Globigerinella calida"                                                                                                                                  
[295] "Globigerinella siphonifera"                                                                                                                             
[296] "Subbotina velascoensis"                                                                                                                                 
[297] "Subbotina hornibrooki"                                                                                                                                  
[298] "Menardella archeomenardii"                                                                                                                              
[299] "Subbotina linaperta-Subbotina utilisindex"                                                                                                              
[300] "Turborotalita quinqueloba"                                                                                                                              
[301] "Turborotalita humilis-Turborotalita cristata-Turborotalita clarkei"                                                                                     
[302] "Globoturborotalita ouachitaensis"                                                                                                                       
[303] "Globoturborotalita gnaucki-Globoturborotalita anguliofficinalis"                                                                                        
[304] "Globoturborotalita labiacrassata"                                                                                                                       
[305] "Globigerinoides conglobatus"                                                                                                                            
[306] "Hirsutella challengeri-Hirsutella juanai"                                                                                                               
[307] "Globigerinoides obliquus"                                                                                                                               
[308] "Globigerinoides extremus"                                                                                                                               
[309] "Globigerinoides mitra"                                                                                                                                  
[310] "Globigerinoides ruber-Globigerinoides seigliei"                                                                                                         
[311] "Globigerinoides bisphericus-Praeorbulina sicanus-Praeorbulina curva-Praeorbulina glomerosa-Praeorbulina circularis-Orbulina suturalis-Orbulina universa"
[312] "Globigerinoides fistulosus"                                                                                                                             
[313] "Globigerinoides trilobus-Globigerinoides sacculifer"                                                                                                    
[314] "Globigerinoides parawoodi"                                                                                                                              
[315] "Sphaeroidinellopsis kochi"                                                                                                                              
[316] "Sphaeroidinellopsis seminulina-Sphaeroidinellopsis paenedehiscens-Sphaeroidinella dehiscens"                                                            
[317] "Globoturborotalita rubescens"                                                                                                                           
[318] "Globoturborotalita tenella"                                                                                                                             
[319] "Globoturborotalita bollii-Globoturborotalita kennetti"                                                                                                  
[320] "Globoturborotalita nepenthes"                                                                                                                           
[321] "Globoturborotalita woodi-Globoturborotalita apertura"                                                                                                   
[322] "Astrorotalia palmerae"                                                                                                                                  
[323] "Subbotina angiporoides"                                                                                                                                 
[324] "Menardella multicamerata"                                                                                                                               
[325] "Globigerinoides subquadratus"                                                                                                                           
[326] "Globoturborotalita brazieri"                                                                                                                            
[327] "Clavigerinella eocanica"                                                                                                                                
[328] "Subbotina crociapertura"                                                                                                                                
[329] "Pulleniatina praespectabilis-Pulleniatina spectabilis-Pulleniatina finalis"                                                                             
[330] "Protentella prolixa-Protentella nicobarensis"                                                                                                           
[331] "Morozovella allisonensis"                                                                                                                               
[332] "Morozovella edgari"                                                                                                                                     
[333] "Globigerina eamesi"                                                                                                                                     
[334] "Globigerina druryi"                                                                                                                                     
[335] "Menardella exilis-Menardella pertenius"                                                                                                                 
[336] "Menardella limbata-Menardella pseudomiocenica-Menardella miocenica"                                                                                     
[337] "Globorotalia plesiotumida"                                                                                                                              
[338] "Globorotalia tumida-Globorotalia flexuosa"                                                                                                              
[339] "Menardella menardii-Menardella fimbriata"                                                                                                               
[340] "Globorotalia ungulata"                                                                                                                                  
[341] "Hirsutella theyeri"                                                                                                                                     
[342] "Hirsutella margaritae-Hirsutella hirsuta"                                                                                                               
[343] "Hirsutella cibaoensis"                                                                                                                                  
[344] "Truncorotalia crassula"                                                                                                                                 
[345] "Truncorotalia crassaconica"                                                                                                                             
[346] "Truncorotalia hessi"                                                                                                                                    
[347] "Truncorotalia crassaformis-Truncorotalia oceanica"                                                                                                      
[348] "Truncorotalia tosaensis"                                                                                                                                
[349] "Truncorotalia cavernula"                                                                                                                                
[350] "Truncorotalia truncatulinoides-Truncorotalia excelsa-Truncorotalia pachytheca"                                                                          
[351] "Hedbergella monmouthensis"                                                                                                                              
[352] "Pseudohastigerina sharkriverensis"                                                                                                                      
[353] "Praemurica uncinata"                                                                                                                                    
[354] "Igorina albeari"                                                                                                                                        
[355] "Igorina tadjikistanensis-Igorina lodoensis-Igorina broedermanni-Igorina anapetes"                                                                       
[356] "Praemurica lozanoi"                                                                                                                                     
[357] "Morozovella velascoensis-Morozovella acuta"                                                                                                             
[358] "Morozovella occlusa"                                                                                                                                    
[359] "Morozovella pasionensis-Morozovella acutispira"                                                                                                         
[360] "Morozovella aequa"                                                                                                                                      
[361] "Planorotalites pseudoscitula-Planorotalites capdevilensis"                                                                                              
[362] "Pseudohastigerina micra"                                                                                                                                
[363] "Morozovella marginodentata"                                                                                                                             
[364] "Morozovella gracilis-Morozovella formosa"                                                                                                               
[365] "Morozovella subbotinae"                                                                                                                                 
[366] "Morozovella lensiformis-Morozovella aragonensis"                                                                                                        
[367] "Morozovella crater"                                                                                                                                     
[368] "Morozovella caucasica"                                                                                                                                  
[369] "Protentelloides primitiva-Protentelloides dalhousiei"                                                                                                   
                  matched_fossils unmatched_fossils_microperforates           unmatched_fossils_other 
                              290                                54                                48 
  matched_species unmatched_species 
              290                49 
$unmatched_fossils_other
 [1] "Alicantina lozanoi"                "Alicantina prolata"                "Ciperoella anguliofficinalis"      "Ciperoella angulisuturalis"        "Ciperoella ciperoensis"           
 [6] "Ciperoella fariasi"                "Dentigloborotalia anfracta"        "Dentoglobigerina baroemoenensis"   "Dentoglobigerina tripartita"       "Globigerinella clavaticamerata"   
[11] "Globigerinella navazuelensis"      "Globigerinoides altiaperturus"     "Globigerinoides bollii"            "Globigerinoides elongatus"         "Globigerinoides italicus"         
[16] "Globigerinoidesella fistulosa"     "Globoconella miotumida"            "Globoconella pseudospinosa"        "Globoconella triangula"            "Globorotalia bella"               
[21] "Globorotaloides stainforthi"       "Globorotaloides suteri"            "Globorotaloides testarugosus"      "Globoturborotalita cancellata"     "Globoturborotalita druryi"        
[26] "Globoturborotalita euapertura"     "Globoturborotalita occlusa"        "Menardella pertenuis"              "Muricohedbergella holmdelensis"    "Muricohedbergella monmouthensis"  
[31] "Neogloboquadrina atlantica"        "Neogloboquadrina incompta"         "Paragloborotalia birnageae"        "Paragloborotalia continuosa"       "Paragloborotalia pseudocontinuosa"
[36] "Parasubbotina hagni"               "Pearsonites anapetes"              "Pearsonites broedermanni"          "Subbotina minima"                  "Trilobatus bisphericus"           
[41] "Trilobatus immaturus"              "Trilobatus praeimmaturus"          "Trilobatus primordius"             "Trilobatus quadrilobatus"          "Trilobatus sacculifer"            
[46] "Trilobatus sicanus"                "Trilobatus subsacculifer"          "Trilobatus trilobus"              

$unmatched_species
 [1] "Catapsydrax parvulus"                 "Catapsydrax stainforthi"              "Clavigerinella caucasica"             "Dentoglobigerina baroemoensis"       
 [5] "Dentoglobigerina rohri"               "Dentoglobigerina sp"                  "Fohsella birnageae"                   "Globigerina angulisuturalis"         
 [9] "Globigerina ciperoensis"              "Globigerina druryi"                   "Globigerina praebulloides"            "Globigerinoides altiapertura"        
[13] "Globigerinoides bisphericus"          "Globigerinoides fistulosus"           "Globigerinoides parawoodi"            "Globigerinoides primordius"          
[17] "Globigerinoides sacculifer"           "Globigerinoides trilobus"             "Globoconella conoidea"                "Globoconella sphericomiozea"         
[21] "Globorotaloides testarugosa"          "Globoturborotalita anguliofficinalis" "Globoturborotalita bollii"            "Hantkenina lehneri"                  
[25] "Hantkenina nanggulanensis"            "Hantkenina singanoae"                 "Hedbergella holmdelensis"             "Hedbergella monmouthensis"           
[29] "Igorina anapetes"                     "Igorina broedermanni"                 "Igorina lodoensis"                    "Menardella fimbriata"                
[33] "Menardella pertenius"                 "Neogloboquadrina continuosa"          "Paragloborotalia bella"               "Parasubbotina aff_pseudobulloides"   
[37] "Parasubbotina prebetica"              "Parasubbotina pseudowilsoni"          "Praemurica lozanoi"                   "Praeorbulina sicanus"                
[41] "Protentella prolixa"                  "Protentelloides dalhousiei"           "Protentelloides primitiva"            "Subbotina hagni"                     
[45] "Subbotina sp1"                        "Subbotina sp2"                        "Turborotalia altispiroides"           "Turborotalia euapertura"             
[49] "Turborotalita praequinqueloba"       

Correct taxonomy for unmatched fossils

Incorporate the corrections suggested by Isabel Fenton.

Update the taxonomy based on modern species

For Triton.

For the tree.

Check the remaining mismatches after the taxonomic update.

                  matched_fossils unmatched_fossils_microperforates           unmatched_fossils_other 
                              324                                54                                 4 
  matched_species unmatched_species 
              324                19 
  matched_lineages unmatched_lineages 
               258                  6 
[1] "Dentigloborotalia anfracta"    "Globigerinella navazuelensis"  "Globorotalia pseudospinosa"    "Globoturborotalita cancellata"

\(\to\) Dentigloborotalia anfracta, Globigerinella navazuelensis and Globoturborotalita cancellata are not recognized as species in the tree.

Regarding Globoconella pseudospinosa, let’s include it after Globoconella puncticulata, following https://www.mikrotax.org/pforams/catalog/Globoconella_pseudospinosa.

Save the tree with the new taxonomy.

Add Triton fossils in Aze tree

Split into monophyletic phylogenies

Display the wall texture on the full phylogeny

Save split trees

Idem on the phylogeny with sampled ancestors

Save split trees

Save individual occurrences

Take the intersection of the morphological taxonomy and the subsampled dataset

Avoid overlaps by removing genera that are present in the wrong clade due to one misplaced species (resp. “Paragloborotalia continuosa”, “Parasubbotina hagni” and “Globorotalia bella”)

character(0)
character(0)
character(0)

Remaining stem genera, as expected

[1] "Globanomalina"      "Planoglobanomalina" "Turborotalia"       "Pseudohastigerina" 

Add Hastigerinidae genera (Hastigerina, Hastigerinella and Orcadia) in the Spinose only clade, given that they are thought to have evolved from Globigerinella (https://www.mikrotax.org/Nannotax3/index.php?module=pf_cenozoic&taxon=Hastigerinidae)

Spinose only

Non-spinose only

Mixed spinose

Compare the number of occurrences with the number of lineages from experts

Save occurrences (no taxonomic information)

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KHBhbGVvUGh5bG8pCmxpYnJhcnkocGh5dG9vbHMpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGdndHJlZSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHRpYmJsZSkKbGlicmFyeShkcGx5cikKYGBgCgojIExvYWQgYW5kIHBsb3QgdGhlIHBoeWxvZ2VueQoKYGBge3J9CmRhdGEocGVhcnNvbjkzKSAjI2xvYWQgYSBwaHlsb2dlbnkKZGF0YShiZXJnZ3Jlbjk1KSAjI2xvYWQgYSB0aW1lc2NhbGUKb3AgPC0gcGFyKG5vLnJlYWRvbmx5PVRSVUUpCnA5MyA8LSB3aXRoKHBlYXJzb245MywgYXMucGFsZW9QaHlsbyhDb2RlLCBQYXJlbnQsIFN0YXJ0LCBFbmQsIGxhYmVsPU5hbWUpKQpgYGAKCiMjIEV4YW1wbGUgMTogd2l0aG91dCBhIHRpbWUgYXhpcy4KCmBgYHtyfQpkcmF3UGh5bG8gKHA5MykKYGBgCgojIyBFeGFtcGxlIDI6IHdpdGggYSAiY2xhc3NpYyIgdGltZSBheGlzLgoKYGBge3J9CmRyYXdQaHlsbyhwOTMsdG1TY2w9YmVyZ2dyZW45NSwgYWRkVGltZUxpbmU9ImNsYXNzaWMiLCB3aGF0VGltZT1jKCJlcG9jaCIsInpvbmUiKSwKICAgICAgICAgIGwycj1UUlVFLCBjZXhUZXh0PWMoMSwgMC41KSwgZHVtcExhc3Q9VFJVRSwgIG5tTGltPTAuMykKYGBgCgojIyBFeGFtcGxlIDM6IGEgZnVsbHkgYmlmdWNhdGluZyB2ZXJzaW9uIHdpdGggZGlmZmVyZW50IHRleHQgc2l6ZXMgZm9yIHRpbWUKCmBgYHtyfQpwOTNjYiA8LSBjcmVhdGVCaWZ1cmNhdGUocDkzKQpkcmF3UGh5bG8gKHA5M2NiLCAKICB0bVNjbD1iZXJnZ3Jlbjk1LCBhZGRUaW1lTGluZT0iY2wiLCB3aGF0VGltZT1jKCJlcG9jaCIsInpvbmUiKSwKICBkdW1wTGFzdD1UUlVFLCBjZXhUZXh0PWMoMSwgMC41KSwgbm1MaW09MC4zLCBzcnRUZXh0PTApCmBgYAoKYGBge3J9CiNleGFtcGxlIDQ6IHdpdGggc3BlY2llcyBhcnJhbmdlZCBvbiB0aGUgeC1heGlzIGFjY29yZGluZyAuLi4KIyMgLi4uLiB0byBzb21lIHJhbmRvbSB0cmFpdCBkYXRhIGZyb20gYSB1bmlmb3JtIGRpc3RyaWJ1dGlvbi4KIyMgLi4uLiBUSElTIERFTElCRVJBVEVMWSBMT09LUyBBIFRPVEFMIE1FU1MKIyNkb24ndCBpbmNsdWRlIGxhdGluIG5hbWVzIGJ5IGxlYXZpbmcgdGhlICJsYWJlbCIgYXJndW1lbnQgZnJlZS4KcDkzcm5kIDwtIHdpdGgocGVhcnNvbjkzLCBhcy5wYWxlb1BoeWxvKENvZGUsIFBhcmVudCwgU3RhcnQsIEVuZCwKCSB4eD1ydW5pZihsZW5ndGgoQ29kZSksLTEsMSkpKQpkcmF3UGh5bG8gKHA5M3JuZCwgdG1TY2w9YmVyZ2dyZW45NSwgYWRkVGltZUxpbmU9ImNsYXNzaWMiLCB3aGF0VGltZT1jKCJlcG9jaCIpLAoJbDJyPVRSVUUsIGNleFRpbWU9MC44LCBkdW1wTGFzdD1UUlVFLCBjZXhUZXh0PTEsIG5tTGltPTAuMykKYGBgCgpgYGB7cn0KdHJlZSA8LSBidWlsZEFwZShwOTNjYikKcGxvdFRyZWUodHJlZSkKYGBgCgojIERpc3Rpbmd1aXNoIHNwZWNpYXRpb24gbW9kZXMKIyMgRnVsbHkgYmlmdXJjYXRpbmcgdHJlZQoKYGBge3J9CkZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYiA8LSByZWFkX3hscygiLi4vLi4vMS1EYXRhX3Jhdy9BemVfcGh5bG9nZW55L2Jydl8xNzhfc21fYXBwZW5kaXhzNS54bHMiLCBzaGVldCA9ICJhTGIiKQpGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGIkYEFuY2VzdG9yIGNvZGVgIDwtIGdzdWIoIk5BIiwgTkEsIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYiRgQW5jZXN0b3IgY29kZWApCkZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYgpgYGAKCmBgYHtyIGZpZy53aWR0aD0yNSwgZmlnLmFzcCA9IC42fQpGb3JhbV9waHlsb2dlbnlfYUxiIDwtIHdpdGgoRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiLCBhcy5wYWxlb1BoeWxvKG5tID0gYExpbmVhZ2UgY29kZWAsIHBuID0gYEFuY2VzdG9yIGNvZGVgLCBzdCA9IGBTdGFydCBkYXRlYCwgZW4gPSBgRW5kIGRhdGVgLCBsYWJlbCA9IGBTcGVjaWVzIGluIGxpbmVhZ2VgKSkKZHJhd1BoeWxvIChGb3JhbV9waHlsb2dlbnlfYUxiLCB0bVNjbD1iZXJnZ3Jlbjk1LCBhZGRUaW1lTGluZT0iY2xhc3NpYyIsIHdoYXRUaW1lPWMoImVwb2NoIiksCiAgICAgICAgICAgbDJyPVRSVUUsIGNleFRpbWU9MC44LCBkdW1wTGFzdD1UUlVFLCBjZXhUZXh0PTEsIG5tTGltPTAuMykKYGBgCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5hc3AgPSAuOH0KRm9yYW1fcGh5bG8gPC0gYnVpbGRBcGUoRm9yYW1fcGh5bG9nZW55X2FMYikKcGxvdChGb3JhbV9waHlsbywgY2V4ID0gMC41KQpheGlzUGh5bG8oKQp3cml0ZS50cmVlKEZvcmFtX3BoeWxvLCAiLi4vLi4vMy1EYXRhX3Byb2Nlc3NlZC9Nb3JwaG9zcGVjaWVzX3BoeWxvZ2VuaWVzL0ZvcmFtc19iaWZ1cmNhdGluZy50cmVlIikKd3JpdGUubmV4dXMoRm9yYW1fcGh5bG8sIGZpbGUgPSAiLi4vLi4vMy1EYXRhX3Byb2Nlc3NlZC9Nb3JwaG9zcGVjaWVzX3BoeWxvZ2VuaWVzL0ZvcmFtc19iaWZ1cmNhdGluZy5uZXgiKQpgYGAKCiMjIEJ1ZGRpbmcvYmlmdXJjYXRpbmcgdHJlZQoKYGBge3J9CkZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsIDwtIHJlYWRfeGxzKCIuLi8uLi8xLURhdGFfcmF3L0F6ZV9waHlsb2dlbnkvYnJ2XzE3OF9zbV9hcHBlbmRpeHM1LnhscyIsIHNoZWV0ID0gImFMIikKRm9yYW1fYW5jZXN0cnlfdGFibGVfYWwkYEFuY2VzdG9yIGNvZGVgIDwtIGdzdWIoIk5BIiwgTkEsIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsJGBBbmNlc3RvciBjb2RlYCkKRm9yYW1fYW5jZXN0cnlfdGFibGVfYWwKYGBgCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5hc3AgPSAuNn0KRm9yYW1fcGh5bG9nZW55X2FMIDwtIHdpdGgoRm9yYW1fYW5jZXN0cnlfdGFibGVfYWwsIGFzLnBhbGVvUGh5bG8obm0gPSBgTGluZWFnZSBjb2RlYCwgcG4gPSBgQW5jZXN0b3IgY29kZWAsIHN0ID0gYFN0YXJ0IGRhdGVgLCBlbiA9IGBFbmQgZGF0ZWApKQpkcmF3UGh5bG8gKEZvcmFtX3BoeWxvZ2VueV9hTCwgdG1TY2w9YmVyZ2dyZW45NSwgYWRkVGltZUxpbmU9ImNsYXNzaWMiLCB3aGF0VGltZT1jKCJlcG9jaCIpLAogICAgICAgICAgIGwycj1UUlVFLCBjZXhUaW1lPTAuOCwgZHVtcExhc3Q9VFJVRSwgY2V4VGV4dD0xLCBubUxpbT0wLjMpCmBgYAojIE9ic2VydmVkIG9yaWdpbmF0aW9uIGFuZCBleHRpbmN0aW9uIHJhdGVzCgpgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5hc3A9LjR9CmJpbl9yYW5nZSA8LSAyCnRpbWVfcG9pbnRzX3RyZWUgPC0gc2VxKDAsIDY2LCBiaW5fcmFuZ2UpCgpvYnNlcnZlZF9vcmlnaW5hdGlvbl9ldmVudHMgPC0gc2FwcGx5KHRpbWVfcG9pbnRzX3RyZWUsIGZ1bmN0aW9uKHRpKXN1bShGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGIkYFN0YXJ0IGRhdGVgPHRpKzEgJiBGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGIkYFN0YXJ0IGRhdGVgPnRpKSkvMgpvYnNlcnZlZF9leHRpbmN0aW9uX2V2ZW50cyA8LSBzYXBwbHkodGltZV9wb2ludHNfdHJlZSwgZnVuY3Rpb24odGkpc3VtKEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYiRgRW5kIGRhdGVgPHRpKzEgJiBGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGIkYEVuZCBkYXRlYD50aSkpLW9ic2VydmVkX29yaWdpbmF0aW9uX2V2ZW50cwoKb2JzZXJ2ZWRfTFRUIDwtIHNhcHBseSh0aW1lX3BvaW50c190cmVlLCBmdW5jdGlvbih0aSlzdW0oRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiJGBTdGFydCBkYXRlYD50aSsxICYgRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiJGBFbmQgZGF0ZWA8PXRpKSkKCm9ic2VydmVkX29yaWdpbmF0aW9uX3JhdGVzIDwtIG9ic2VydmVkX29yaWdpbmF0aW9uX2V2ZW50cy9vYnNlcnZlZF9MVFQvYmluX3JhbmdlCm9ic2VydmVkX2V4dGluY3Rpb25fcmF0ZXMgPC0gb2JzZXJ2ZWRfZXh0aW5jdGlvbl9ldmVudHMvb2JzZXJ2ZWRfTFRUL2Jpbl9yYW5nZQoKcGxvdCgtdGltZV9wb2ludHNfdHJlZSwgb2JzZXJ2ZWRfb3JpZ2luYXRpb25fcmF0ZXMsIGNvbD0ic2t5Ymx1ZSIsIGx3ZD0yLCB0eXBlPSJsIiwgeWxpbT1jKDAsMS4wKSkKbGluZXMoLXRpbWVfcG9pbnRzX3RyZWUsIG9ic2VydmVkX2V4dGluY3Rpb25fcmF0ZXMsIGNvbD0ic2FsbW9uIiwgbHdkPTIpCmBgYAoKIyBUcmFuc2Zvcm1hdGlvbnMKIyMgRXh0cmFjdCBzbWFsbGVyIHRyZWVzCgpgYGB7cn0KZm9yYW1fdGF4YSA9IHdpdGgoRm9yYW1fYW5jZXN0cnlfdGFibGVfYWwsIGRhdGEuZnJhbWUodGF4b249YExpbmVhZ2UgY29kZWAsIG1pbl9hZ2U9YEVuZCBkYXRlYCwgbWF4X2FnZT1gU3RhcnQgZGF0ZWApKQpmb3JhbV90YXhhJHRheG9uIDwtIGdzdWIoIi4qLSIsICIiLCBmb3JhbV90YXhhJHRheG9uKQojZm9yYW1fdGF4YSRtYXggPC0gZm9yYW1fdGF4YSRtYXggKyBydW5pZihucm93KGZvcmFtX3RheGEpKQojZm9yYW1fdGF4YSRtaW4gPC0gc2FwcGx5KGZvcmFtX3RheGEkbWluIC0gcnVuaWYobnJvdyhmb3JhbV90YXhhKSksIG1heCwgYj0wKQpoZWFkKGZvcmFtX3RheGEpCmBgYAoKCmBgYHtyfQpmb3JhbV90YXhhX3NhbXBsZSA8LSBzYW1wbGUoZ3JlcCgiVCIsIGZvcmFtX3RheGEkdGF4b24sIHZhbHVlPVQpLCA1KQpGb3JhbV9waHlsb19zYW1wbGUgPC0ga2VlcC50aXAocGh5ID0gRm9yYW1fcGh5bG8sIHRpcCA9IGZvcmFtX3RheGFfc2FtcGxlKQpwbG90KEZvcmFtX3BoeWxvX3NhbXBsZSwgc2hvdy5ub2RlLmxhYmVsID0gVCkKI3Bsb3QoRm9yYW1fcGh5bG8pCmF4aXNQaHlsbygpCndyaXRlLnRhYmxlKGZvcmFtX3RheGEsICIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL01vcnBob3NwZWNpZXNfcGh5bG9nZW5pZXMvZm9yYW1zX3RheGEudHN2Iiwgc2VwPSJcdCIsIHJvdy5uYW1lcyA9IEYsIHF1b3RlID0gRikKYGBgCgpgYGB7cn0Kd3JpdGUudHJlZShGb3JhbV9waHlsb19zYW1wbGUsICIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL01vcnBob3NwZWNpZXNfcGh5bG9nZW5pZXMvRm9yYW1zX3NtYWxsLnRyZWUiKQp3cml0ZS5uZXh1cyhGb3JhbV9waHlsb19zYW1wbGUsIGZpbGUgPSAiLi4vLi4vMy1EYXRhX3Byb2Nlc3NlZC9Nb3JwaG9zcGVjaWVzX3BoeWxvZ2VuaWVzL0ZvcmFtc19zbWFsbC5uZXgiKQpgYGAKCiMjIFVwZGF0ZSBzb21lIHBoeWxvZ2VuZXRpYyBwbGFjZW1lbnRzCgpMaW5lYWdlIE4xNTAgKFBhcmFnbG9ib3JvdGFsaWEgcHNldWRva3VnbGVyaS1QYXJhZ2xvYm9yb3RhbGlhIGt1Z2xlcmkpIGhhcyBiZWVuIHBsYWNlZCBieSBBemUgZXQgYWwuIGluIHRoZSBOb24tU3Bpbm9zZSBncm91cCwgYnV0IGhhcyBiZWVuIGNvbmZpcm1lZCByZWNlbnRseSB3aXRoaW4gdGhlIFBhcmFnbG9ib3JvdGFsaWEgZ2VudXMsIGFzIGEgbGlrZWx5IGRlc2NlbmRlbnQgb2YgUGFyYWdsb2Jvcm90YWxpYSBuYW5hIChMZWNraWUgZXQgYWwuIDIwMTgsIGh0dHBzOi8vd3d3Lm1pa3JvdGF4Lm9yZy9wZm9yYW1zL2luZGV4LnBocD9pZD0xMDQzNDcpLgoKYGBge3J9CkZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYltGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGIkYExpbmVhZ2UgY29kZWAgJWluJSBjKCJOMTI2IiwgIk4xNDkiLCAiTjE1MCIsICJOMTUxIiwgIk4xNjMiLCAiTjE5MyIpLF0KCkZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl91cGRhdGVkIDwtIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYgoKIyBSZW1vdmUgdGhlIGxpbmVhZ2VzIE4xNDksIDE1MCBhbmQgTjE1MSBmcm9tIHRoZSBmb3JtZXIgYW5jZXN0b3IgRGVudG9nbG9iaWdlcmluYSBnYWxhdmlzaQoKIyBFeHRlbmQgbGluZWFnZSBOMjMgdG8gZ3JhZnQgaXQgdG8gTjE0OSAoRGVudG9nbG9iaWdlcmluYSBnYWxhdmlzaSkKRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX3VwZGF0ZWRbRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX3VwZGF0ZWQkYExpbmVhZ2UgY29kZWAgPT0gIk4yMyIsXSRgQW5jZXN0b3IgY29kZWAgPC0gIk4xNDkiCkZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl91cGRhdGVkW0ZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl91cGRhdGVkJGBMaW5lYWdlIGNvZGVgID09ICJOMjMiLF0kYFN0YXJ0IGRhdGVgIDwtIDM3LjIKCiMgTWVyZ2UgTjE1MCBhbmQgTjE1MQpGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfdXBkYXRlZFtGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfdXBkYXRlZCRgTGluZWFnZSBjb2RlYCA9PSAiTjE1MCIsXSRgRW5kIGRhdGVgIDwtIDIyCkZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl91cGRhdGVkW0ZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl91cGRhdGVkJGBMaW5lYWdlIGNvZGVgID09ICJOMTUyIixdJGBBbmNlc3RvciBjb2RlYCA8LSAiTjE1MCIKRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX3VwZGF0ZWRbRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX3VwZGF0ZWQkYExpbmVhZ2UgY29kZWAgPT0gIlQxNTMiLF0kYEFuY2VzdG9yIGNvZGVgIDwtICJOMTUwIgoKIyBHcmFmdCB0aGUgbGluZWFnZSBOMTUwIHRvIHRoZSBuZXcgYW5jZXN0b3IgTjE5MyAoUGFyYWdsb2Jvcm90YWxpYSBuYW5hKQpGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfdXBkYXRlZFtGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfdXBkYXRlZCRgTGluZWFnZSBjb2RlYCA9PSAiTjE1MCIsXSRgQW5jZXN0b3IgY29kZWAgPC0gIk4xOTMiCkZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl91cGRhdGVkW0ZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl91cGRhdGVkJGBMaW5lYWdlIGNvZGVgID09ICJOMTUxIixdIDwtIHRpYmJsZShgTGluZWFnZSBjb2RlYCA9ICJOMTkzYmlzIiwgYEFuY2VzdG9yIGNvZGVgID0gIk4xOTMiLCBgU3RhcnQgZGF0ZWAgPSAzNy4yLCBgRW5kIGRhdGVgID0gMzAuNSwgYFNwZWNpZXMgaW4gbGluZWFnZWAgPSAiUGFyYWdsb2Jvcm90YWxpYSBuYW5hIikKRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX3VwZGF0ZWRbRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX3VwZGF0ZWQkYExpbmVhZ2UgY29kZWAgPT0gIk4xOTMiLF0kYEVuZCBkYXRlYCA8LSAzNy4yCkZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl91cGRhdGVkW0ZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl91cGRhdGVkJGBMaW5lYWdlIGNvZGVgID09ICJUMTk0IixdJGBBbmNlc3RvciBjb2RlYCA8LSAiTjE5M2JpcyIKRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX3VwZGF0ZWRbRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX3VwZGF0ZWQkYExpbmVhZ2UgY29kZWAgPT0gIk4xOTUiLF0kYEFuY2VzdG9yIGNvZGVgIDwtICJOMTkzYmlzIgoKRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX3VwZGF0ZWRbRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX3VwZGF0ZWQkYExpbmVhZ2UgY29kZWAgJWluJSBjKCJOMTI2IiwgIk4xNDkiLCAiTjE1MCIsICJOMTYzIiwgIk4xOTMiLCAiTjE5M2JpcyIpLF0KYGBgCgpgYGB7cn0KRm9yYW1fcGh5bG9nZW55X2FMYl91cGRhdGVkIDwtIHdpdGgoRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX3VwZGF0ZWQsIGFzLnBhbGVvUGh5bG8obm0gPSBgTGluZWFnZSBjb2RlYCwgcG4gPSBgQW5jZXN0b3IgY29kZWAsIHN0ID0gYFN0YXJ0IGRhdGVgLCBlbiA9IGBFbmQgZGF0ZWAsIGxhYmVsID0gYFNwZWNpZXMgaW4gbGluZWFnZWApKQpkcmF3UGh5bG8gKEZvcmFtX3BoeWxvZ2VueV9hTGJfdXBkYXRlZCwgdG1TY2w9YmVyZ2dyZW45NSwgYWRkVGltZUxpbmU9ImNsYXNzaWMiLCB3aGF0VGltZT1jKCJlcG9jaCIpLAogICAgICAgICAgIGwycj1UUlVFLCBjZXhUaW1lPTAuOCwgZHVtcExhc3Q9VFJVRSwgY2V4VGV4dD0xLCBubUxpbT0wLjMpCmBgYAoKCmBgYHtyfQpGb3JhbV9waHlsb191cGRhdGVkIDwtIGJ1aWxkQXBlKEZvcmFtX3BoeWxvZ2VueV9hTGJfdXBkYXRlZCkKcGxvdChGb3JhbV9waHlsb191cGRhdGVkLCBjZXggPSAwLjQpCmBgYAoKIyMgQWRkIGZvc3NpbHMKIyMjIE5ldyBmdW5jdGlvbiB0byBhZGQgZm9zc2lscwoKYGBge3J9CmFkZC5pbnRlcm5hbC5mb3NzaWwgPC0gZnVuY3Rpb24odHJlZSwgbm9kZS5sYWJlbCwgcG9zaXRpb24sIHdoZXJlLm5vZGU9TkEsIHdoZXJlLnRpcD1OQSl7CiAgaWYgKCFpcy5uYSh3aGVyZS5ub2RlKSkgdHJlZSA8LSBiaW5kLnRpcCh0cmVlLCAiTmV3VCIsIHdoZXJlPWxlbmd0aCh0cmVlJHRpcC5sYWJlbCkrd2hpY2godHJlZSRub2RlLmxhYmVsPT13aGVyZS5ub2RlKSwgZWRnZS5sZW5ndGg9MCwgcG9zaXRpb249cG9zaXRpb24pCiAgZWxzZSBpZiAoIWlzLm5hKHdoZXJlLnRpcCkpICB0cmVlIDwtIGJpbmQudGlwKHRyZWUsICJOZXdUIiwgd2hlcmU9d2hpY2godHJlZSR0aXAubGFiZWw9PXdoZXJlLnRpcCksICBlZGdlLmxlbmd0aD0wLCBwb3NpdGlvbj1wb3NpdGlvbikKICBlbHNlIHdhcm5pbmcoIkVpdGhlciBgd2hlcmUubm9kZWAgb3IgYHdoZXJlLnRpcGAgc2hvdWxkIGJlIHByb3ZpZGVkIikKICB0cmVlJG5vZGUubGFiZWxbdHJlZSRub2RlLmxhYmVsPT0iTkEiXSA8LSBub2RlLmxhYmVsCiAgdHJlZSA8LSBkcm9wLnRpcCh0cmVlLCAiTmV3VCIsIGNvbGxhcHNlLnNpbmdsZXM9RikKICByZXR1cm4gKHRyZWUpCn0KCkZvcmFtX3BoeWxvX3NhbXBsZV9mb3NzaWxzIDwtIGFkZC5pbnRlcm5hbC5mb3NzaWwoRm9yYW1fcGh5bG9fc2FtcGxlLCB3aGVyZS50aXA9Rm9yYW1fcGh5bG9fc2FtcGxlJHRpcC5sYWJlbFszXSwgIkZuIiwgcG9zaXRpb249MykKcGxvdChGb3JhbV9waHlsb19zYW1wbGVfZm9zc2lscywgc2hvdy5ub2RlLmxhYmVsPVQpCnBsb3QoZHJvcC50aXAoRm9yYW1fcGh5bG9fc2FtcGxlX2Zvc3NpbHMsIEZvcmFtX3BoeWxvX3NhbXBsZSR0aXAubGFiZWxbMV0sIHRyaW0uaW50ZXJuYWw9RiksIHNob3cubm9kZS5sYWJlbD1UKQpGb3JhbV9waHlsb19zYW1wbGVfZm9zc2lscyA8LSBhZGQuaW50ZXJuYWwuZm9zc2lsKEZvcmFtX3BoeWxvX3NhbXBsZSwgd2hlcmUubm9kZT10YWlsKEZvcmFtX3BoeWxvX3NhbXBsZSRub2RlLmxhYmVsLDEpLCAiRm4iLCBwb3NpdGlvbj0zKQpwbG90KEZvcmFtX3BoeWxvX3NhbXBsZV9mb3NzaWxzLCBzaG93Lm5vZGUubGFiZWw9VCkKYGBgCgojIyMgTWF0Y2ggZm9zc2lsIHNwZWNpZXMgaW4gVHJpdG9uIGFuZCBsaW5lYWdlcyBpbiB0aGUgdHJlZQoKYGBge3J9CmhlYWQoRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX3VwZGF0ZWQpCkZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl91cGRhdGVkJGBTcGVjaWVzIGluIGxpbmVhZ2VgCkZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl91cGRhdGVkW2dyZXAoIkFjYXJpbmluYSBzdWJzcGhhZXJpY2EiLCBGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfdXBkYXRlZCRgU3BlY2llcyBpbiBsaW5lYWdlYCksXQpgYGAKCmBgYHtyfQp0cml0b24ucHJlcyA8LSByZWFkLmNzdigiLi4vLi4vMy1EYXRhX3Byb2Nlc3NlZC9Ucml0b25fb2NjdXJyZW5jZXMvVHJpdG9uREJfdHJpbW1lZF9ydW5pZi5jc3YiLCByb3cubmFtZXM9MSkKbWF0Y2hlZF9mb3NzaWxzIDwtIG5hbWVzKHdoaWNoKHNhcHBseSh1bmlxdWUodHJpdG9uLnByZXMkc3BlY2llcyksIGZ1bmN0aW9uKHNwKSBhbnkoZ3JlcGwoc3AsIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl91cGRhdGVkJGBTcGVjaWVzIGluIGxpbmVhZ2VgKSkpKSkKdW5tYXRjaGVkX2Zvc3NpbHMgPC0gbmFtZXMod2hpY2goc2FwcGx5KHVuaXF1ZSh0cml0b24ucHJlcyRzcGVjaWVzKSwgZnVuY3Rpb24oc3ApICFhbnkoZ3JlcGwoc3AsIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl91cGRhdGVkJGBTcGVjaWVzIGluIGxpbmVhZ2VgKSkpKSkKbWljcm9wZXJmb3JhdGVzIDwtIHVuaXF1ZSh0cml0b24ucHJlc1t0cml0b24ucHJlcyRNYWNyby5taWNybz09Ik1pY3JvcGVyZm9yYXRlIiwic3BlY2llcyJdKQp1bm1hdGNoZWRfZm9zc2lsc19vdGhlciA8LSB1bm1hdGNoZWRfZm9zc2lsc1shKHVubWF0Y2hlZF9mb3NzaWxzICVpbiUgbWljcm9wZXJmb3JhdGVzKV0KYyhtYXRjaGVkX2Zvc3NpbHM9bGVuZ3RoKG1hdGNoZWRfZm9zc2lscyksIHVubWF0Y2hlZF9mb3NzaWxzX21pY3JvcGVyZm9yYXRlcz1sZW5ndGgobWljcm9wZXJmb3JhdGVzKSwgdW5tYXRjaGVkX2Zvc3NpbHNfb3RoZXI9bGVuZ3RoKHVubWF0Y2hlZF9mb3NzaWxzX290aGVyKSkKCnRyZWVfc3BlY2llcyA8LSB1bmlxdWUoUmVkdWNlKGMsc2FwcGx5KEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl91cGRhdGVkJGBTcGVjaWVzIGluIGxpbmVhZ2VgLCBzdHJzcGxpdCwgc3BsaXQ9Ii0iKSkpCm1hdGNoZWRfc3BlY2llcyA8LSBtYXRjaGVkX2Zvc3NpbHMKdW5tYXRjaGVkX3NwZWNpZXMgPC0gdHJlZV9zcGVjaWVzWyEodHJlZV9zcGVjaWVzICVpbiUgbWF0Y2hlZF9mb3NzaWxzKV0KYyhtYXRjaGVkX3NwZWNpZXM9bGVuZ3RoKG1hdGNoZWRfc3BlY2llcyksIHVubWF0Y2hlZF9zcGVjaWVzPWxlbmd0aCh1bm1hdGNoZWRfc3BlY2llcykpCmBgYAoKYGBge3J9Cmxpc3QodW5tYXRjaGVkX2Zvc3NpbHNfb3RoZXI9c29ydCh1bm1hdGNoZWRfZm9zc2lsc19vdGhlciksIHVubWF0Y2hlZF9zcGVjaWVzPXNvcnQodW5tYXRjaGVkX3NwZWNpZXMpKQp3cml0ZS50YWJsZShzb3J0KHVubWF0Y2hlZF9mb3NzaWxzX290aGVyKSwgIi4uLy4uLzMtRGF0YV9wcm9jZXNzZWQvTW9ycGhvc3BlY2llc19waHlsb2dlbmllcy9NYWNyb3BlcmZvcmF0ZV9mb3NzaWxzX25vdF9pbl90aGVfdHJlZS50eHQiLCByb3cubmFtZXM9RiwgY29sLm5hbWVzPUYpCndyaXRlLnRhYmxlKHNvcnQodW5tYXRjaGVkX3NwZWNpZXMpLCAiLi4vLi4vMy1EYXRhX3Byb2Nlc3NlZC9Nb3JwaG9zcGVjaWVzX3BoeWxvZ2VuaWVzL1NwZWNpZXNfd2l0aG91dF9mb3NzaWxzLnR4dCIsIHJvdy5uYW1lcz1GLCBjb2wubmFtZXM9RikKYGBgCgojIyMgQ29ycmVjdCB0YXhvbm9teSBmb3IgdW5tYXRjaGVkIGZvc3NpbHMKCkluY29ycG9yYXRlIHRoZSBjb3JyZWN0aW9ucyBzdWdnZXN0ZWQgYnkgSXNhYmVsIEZlbnRvbi4KCmBgYHtyfQojIENhdXNlcyBvZiBtaXNtYXRjaCAoYnkgSXNhYmVsIEZlbnRvbikKZm9zc2lsX21hdGNoaW5nIDwtIHJlYWRfeGxzeCgiLi4vLi4vMS1EYXRhX3Jhdy9BemVfcGh5bG9nZW55L0lGX01hdGNoX2Zvc3NpbHNfYW5kX2xpbmVhZ2VzLnhsc3giLCBzaGVldD0xKQpsaW5lYWdlX21hdGNoaW5nIDwtIHJlYWRfeGxzeCgiLi4vLi4vMS1EYXRhX3Jhdy9BemVfcGh5bG9nZW55L0lGX01hdGNoX2Zvc3NpbHNfYW5kX2xpbmVhZ2VzLnhsc3giLCBzaGVldD0yKQpmb3NzaWxfbWF0Y2hpbmcKbGluZWFnZV9tYXRjaGluZwpgYGAKCmBgYHtyfQojIENoYW5nZSBtb3JwaG9zcGVjaWVzIG5hbWVzIGluIHRoZSB0cmVlIHRvIG1hdGNoIFRyaXRvbiBmb3NzaWxzIHRoYXQgYXJlIG5vdCByZXByZXNlbnRlZCBpbiB0aGUgdHJlZSBkdWUgdG8gbm9tZW5jbGF0dXJlIGNoYW5nZXMKRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX25ld1RheG8gPC0gRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX3VwZGF0ZWQKZm9yIChzcF9uYW1lIGluIG5hLm9taXQodW5pcXVlKGZvc3NpbF9tYXRjaGluZyRgTmFtZSBpbiB0cmVlYCkpKXsKICAjZm9zc2lsX25hbWVzIDwtIHBhc3RlKGZvc3NpbF9tYXRjaGluZ1t3aGljaChmb3NzaWxfbWF0Y2hpbmckYE5hbWUgaW4gdHJlZWA9PXNwX25hbWUpLCJNYWNyb3BlcmZvcmF0ZXMgbm90IGluIHRyZWUiXVtbMV1dLCBjb2xsYXBzZT0iLSIpCiAgZm9zc2lsX25hbWVzIDwtIGZvc3NpbF9tYXRjaGluZ1t3aGljaChmb3NzaWxfbWF0Y2hpbmckYE5hbWUgaW4gdHJlZWA9PXNwX25hbWUpLCJGb3NzaWwgbmFtZXMiXVtbMV1dWzFdCiAgRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX25ld1RheG8kYFNwZWNpZXMgaW4gbGluZWFnZWAgPC0gZ3N1YihzcF9uYW1lLCBmb3NzaWxfbmFtZXMsIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9uZXdUYXhvJGBTcGVjaWVzIGluIGxpbmVhZ2VgKQp9CgojIENoYW5nZSBtb3JwaG9zcGVjaWVzIG5hbWVzIGluIHRoZSB0cmVlIGZvciB0aGUgb25lcyB3aGljaCBkbyBub3QgaGF2ZSBjb3JyZXNwb25kaW5nIFRyaXRvbiBmb3NzaWxzIGR1ZSB0byBvdXRkYXRlZCBub21lbmNsYXR1cmUKZm9yIChpIGluIHdoaWNoKGxpbmVhZ2VfbWF0Y2hpbmckYFNwZWNpZXMgd2l0aG91dCBmb3NzaWxzYCE9bGluZWFnZV9tYXRjaGluZyRgTmFtZSBpbiBUcml0b24gKGFjY2VwdGVkIG5hbWUpYCkpewogIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9uZXdUYXhvJGBTcGVjaWVzIGluIGxpbmVhZ2VgIDwtIGdzdWIobGluZWFnZV9tYXRjaGluZ1tpLCJTcGVjaWVzIHdpdGhvdXQgZm9zc2lscyJdLCBsaW5lYWdlX21hdGNoaW5nW2ksIk5hbWUgaW4gVHJpdG9uIChhY2NlcHRlZCBuYW1lKSJdLCBGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfbmV3VGF4byRgU3BlY2llcyBpbiBsaW5lYWdlYCkKfQpgYGAKCiMjIyBVcGRhdGUgdGhlIHRheG9ub215IGJhc2VkIG9uIG1vZGVybiBzcGVjaWVzCgpGb3IgVHJpdG9uLgoKYGBge3J9CiMjIFNwaW5vc2UKI3RyaXRvbi5wcmVzJHNwZWNpZXMgPC0gZ3N1YigiR2xvYmlnZXJpbm9pZGVzIHJ1YmVyIiwgIkdsb2JpZ2VyaW5vaWRlcyBydWJlci1hbGJ1cyIsIHRyaXRvbi5wcmVzJHNwZWNpZXMpCnRyaXRvbi5wcmVzJHNwZWNpZXMgPC0gZ3N1YigiQmVlbGxhIG1lZ2FzdG9tYSIsICJCZWVsbGEgZGlnaXRhdGEiLCB0cml0b24ucHJlcyRzcGVjaWVzKQp0cml0b24ucHJlcyRzcGVjaWVzIDwtIGdzdWIoIkdsb2JvdHVyYm9yb3RhbGl0YSB0ZW5lbGxhIiwgIkdsb2JpZ2VyaW5vaWRlcyB0ZW5lbGx1cyIsIHRyaXRvbi5wcmVzJHNwZWNpZXMpCnRyaXRvbi5wcmVzJHNwZWNpZXMgPC0gZ3N1YigiVHJpbG9iYXR1cyBpbW1hdHVydXMiLCAiVHJpbG9iYXR1cyBzYWNjdWxpZmVyIiwgdHJpdG9uLnByZXMkc3BlY2llcykKdHJpdG9uLnByZXMkc3BlY2llcyA8LSBnc3ViKCJUcmlsb2JhdHVzIHF1YWRyaWxvYmF0dXMiLCAiVHJpbG9iYXR1cyBzYWNjdWxpZmVyIiwgdHJpdG9uLnByZXMkc3BlY2llcykKdHJpdG9uLnByZXMkc3BlY2llcyA8LSBnc3ViKCJUcmlsb2JhdHVzIHRyaWxvYnVzIiwgIlRyaWxvYmF0dXMgc2FjY3VsaWZlciIsIHRyaXRvbi5wcmVzJHNwZWNpZXMpCnRyaXRvbi5wcmVzJHNwZWNpZXMgPC0gZ3N1YigiVHVyYm9yb3RhbGl0YSBjcmlzdGF0YSIsICJUdXJib3JvdGFsaXRhIGh1bWlsaXMiLCB0cml0b24ucHJlcyRzcGVjaWVzKQoKIyMgTm9uLXNwaW5vc2UKdHJpdG9uLnByZXMkc3BlY2llcyA8LSBnc3ViKCJUcnVuY29yb3RhbGlhIiwgIkdsb2Jvcm90YWxpYSIsIHRyaXRvbi5wcmVzJHNwZWNpZXMpCnRyaXRvbi5wcmVzJHNwZWNpZXMgPC0gZ3N1YigiTWVuYXJkZWxsYSIsICJHbG9ib3JvdGFsaWEiLCB0cml0b24ucHJlcyRzcGVjaWVzKQp0cml0b24ucHJlcyRzcGVjaWVzIDwtIGdzdWIoIkhpcnN1dGVsbGEiLCAiR2xvYm9yb3RhbGlhIiwgdHJpdG9uLnByZXMkc3BlY2llcykKdHJpdG9uLnByZXMkc3BlY2llcyA8LSBnc3ViKCJHbG9ib2NvbmVsbGEiLCAiR2xvYm9yb3RhbGlhIiwgdHJpdG9uLnByZXMkc3BlY2llcykKdHJpdG9uLnByZXMkc3BlY2llcyA8LSBnc3ViKCJHbG9ib3JvdGFsaWEgdGhleWVyaSIsICJHbG9ib3JvdGFsaWEgZWFzdHJvcGFjaWEiLCB0cml0b24ucHJlcyRzcGVjaWVzKQp0cml0b24ucHJlcyRzcGVjaWVzIDwtIGdzdWIoIkdsb2Jvcm90YWxpYSBvY2VhbmljYSIsICJHbG9ib3JvdGFsaWEgY3Jhc3NhZm9ybWlzIiwgdHJpdG9uLnByZXMkc3BlY2llcykKdHJpdG9uLnByZXMkc3BlY2llcyA8LSBnc3ViKCJHbG9ib3JvdGFsaWEgZXhjZWxzYSIsICJHbG9ib3JvdGFsaWEgdHJ1bmNhdHVsaW5vaWRlcyIsIHRyaXRvbi5wcmVzJHNwZWNpZXMpCnRyaXRvbi5wcmVzJHNwZWNpZXMgPC0gZ3N1YigiR2xvYm9yb3RhbGlhIHBhY2h5dGhlY2EiLCAiR2xvYm9yb3RhbGlhIHRydW5jYXR1bGlub2lkZXMiLCB0cml0b24ucHJlcyRzcGVjaWVzKQp0cml0b24ucHJlcyRzcGVjaWVzIDwtIGdzdWIoIkdsb2Jvcm90YWxpYSBiZXJtdWRlemkiLCAiR2xvYm9yb3RhbGlhIHNjaXR1bGEiLCB0cml0b24ucHJlcyRzcGVjaWVzKQp0cml0b24ucHJlcyRzcGVjaWVzIDwtIGdzdWIoIlB1bGxlbmlhdGluYSBmaW5hbGlzIiwgIlB1bGxlbmlhdGluYSBvYmxpcXVpbG9jdWxhdGEiLCB0cml0b24ucHJlcyRzcGVjaWVzKQoKIyBNaWNyb3BlcmZvcmF0ZQp0cml0b24ucHJlcyRzcGVjaWVzIDwtIGdzdWIoIlRlbnVpdGVsbGEgaW90YSIsICJUZW51aXRlbGxpdGEgaW90YSIsIHRyaXRvbi5wcmVzJHNwZWNpZXMpCnRyaXRvbi5wcmVzJHNwZWNpZXMgPC0gZ3N1YigiR2xvYmlnZXJpbml0YSBwYXJrZXJhZSIsICJUZW51aXRlbGxpdGEgZmxlaXNoZXJpIiwgdHJpdG9uLnByZXMkc3BlY2llcykKdHJpdG9uLnByZXMkc3BlY2llcyA8LSBnc3ViKCJUZW51aXRlbGxhIHBhcmtlcmFlIiwgIlRlbnVpdGVsbGl0YSBwYXJrZXJhZSIsIHRyaXRvbi5wcmVzJHNwZWNpZXMpCgojIEluZGVwZW5kZW50IHBsYW5rdG9uaWMgb3JpZ2luCnRyaXRvbi5wcmVzJHNwZWNpZXMgPC0gZ3N1YigiR2FsbGl0ZWxsaWEgdml2YW5zIiwgIk5lb2dhbGxpdGVsbGlhIHZpdmFucyIsIHRyaXRvbi5wcmVzJHNwZWNpZXMpCnRyaXRvbi5wcmVzJHNwZWNpZXMgPC0gZ3N1YigiU3RyZXB0b2NoaWx1cyBnbG9iaWdlcnVtIiwgIkJvbGl2aW5hIHZhcmlhYmlsaXMiLCB0cml0b24ucHJlcyRzcGVjaWVzKQpgYGAKCkZvciB0aGUgdHJlZS4KCmBgYHtyfQojIyBTcGlub3NlCiNGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfbmV3VGF4byRgU3BlY2llcyBpbiBsaW5lYWdlYCA8LSBnc3ViKCJHbG9iaWdlcmlub2lkZXMgcnViZXIiLCAiR2xvYmlnZXJpbm9pZGVzIHJ1YmVyLWFsYnVzIiwgRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX25ld1RheG8kYFNwZWNpZXMgaW4gbGluZWFnZWApCkZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9uZXdUYXhvJGBTcGVjaWVzIGluIGxpbmVhZ2VgIDwtIGdzdWIoIkJlZWxsYSBtZWdhc3RvbWEiLCAiQmVlbGxhIGRpZ2l0YXRhIiwgRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX25ld1RheG8kYFNwZWNpZXMgaW4gbGluZWFnZWApCkZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9uZXdUYXhvJGBTcGVjaWVzIGluIGxpbmVhZ2VgIDwtIGdzdWIoIkdsb2JvdHVyYm9yb3RhbGl0YSB0ZW5lbGxhIiwgIkdsb2JpZ2VyaW5vaWRlcyB0ZW5lbGx1cyIsIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9uZXdUYXhvJGBTcGVjaWVzIGluIGxpbmVhZ2VgKQpGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfbmV3VGF4byRgU3BlY2llcyBpbiBsaW5lYWdlYCA8LSBnc3ViKCJUcmlsb2JhdHVzIGltbWF0dXJ1cyIsICJUcmlsb2JhdHVzIHNhY2N1bGlmZXIiLCBGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfbmV3VGF4byRgU3BlY2llcyBpbiBsaW5lYWdlYCkKRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX25ld1RheG8kYFNwZWNpZXMgaW4gbGluZWFnZWAgPC0gZ3N1YigiVHJpbG9iYXR1cyBxdWFkcmlsb2JhdHVzIiwgIlRyaWxvYmF0dXMgc2FjY3VsaWZlciIsIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9uZXdUYXhvJGBTcGVjaWVzIGluIGxpbmVhZ2VgKQpGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfbmV3VGF4byRgU3BlY2llcyBpbiBsaW5lYWdlYCA8LSBnc3ViKCJUcmlsb2JhdHVzIHRyaWxvYnVzIiwgIlRyaWxvYmF0dXMgc2FjY3VsaWZlciIsIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9uZXdUYXhvJGBTcGVjaWVzIGluIGxpbmVhZ2VgKQpGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfbmV3VGF4byRgU3BlY2llcyBpbiBsaW5lYWdlYCA8LSBnc3ViKCJUdXJib3JvdGFsaXRhIGNyaXN0YXRhIiwgIlR1cmJvcm90YWxpdGEgaHVtaWxpcyIsIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9uZXdUYXhvJGBTcGVjaWVzIGluIGxpbmVhZ2VgKQoKIyMgTm9uLXNwaW5vc2UKRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX25ld1RheG8kYFNwZWNpZXMgaW4gbGluZWFnZWAgPC0gZ3N1YigiVHJ1bmNvcm90YWxpYSIsICJHbG9ib3JvdGFsaWEiLCBGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfbmV3VGF4byRgU3BlY2llcyBpbiBsaW5lYWdlYCkKRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX25ld1RheG8kYFNwZWNpZXMgaW4gbGluZWFnZWAgPC0gZ3N1YigiTWVuYXJkZWxsYSIsICJHbG9ib3JvdGFsaWEiLCBGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfbmV3VGF4byRgU3BlY2llcyBpbiBsaW5lYWdlYCkKRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX25ld1RheG8kYFNwZWNpZXMgaW4gbGluZWFnZWAgPC0gZ3N1YigiSGlyc3V0ZWxsYSIsICJHbG9ib3JvdGFsaWEiLCBGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfbmV3VGF4byRgU3BlY2llcyBpbiBsaW5lYWdlYCkKRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX25ld1RheG8kYFNwZWNpZXMgaW4gbGluZWFnZWAgPC0gZ3N1YigiR2xvYm9jb25lbGxhIiwgIkdsb2Jvcm90YWxpYSIsIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9uZXdUYXhvJGBTcGVjaWVzIGluIGxpbmVhZ2VgKQpGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfbmV3VGF4byRgU3BlY2llcyBpbiBsaW5lYWdlYCA8LSBnc3ViKCJHbG9ib3JvdGFsaWEgdGhleWVyaSIsICJHbG9ib3JvdGFsaWEgZWFzdHJvcGFjaWEiLCBGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfbmV3VGF4byRgU3BlY2llcyBpbiBsaW5lYWdlYCkKRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX25ld1RheG8kYFNwZWNpZXMgaW4gbGluZWFnZWAgPC0gZ3N1YigiR2xvYm9yb3RhbGlhIG9jZWFuaWNhIiwgIkdsb2Jvcm90YWxpYSBjcmFzc2Fmb3JtaXMiLCBGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfbmV3VGF4byRgU3BlY2llcyBpbiBsaW5lYWdlYCkKRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX25ld1RheG8kYFNwZWNpZXMgaW4gbGluZWFnZWAgPC0gZ3N1YigiR2xvYm9yb3RhbGlhIGV4Y2Vsc2EiLCAiR2xvYm9yb3RhbGlhIHRydW5jYXR1bGlub2lkZXMiLCBGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfbmV3VGF4byRgU3BlY2llcyBpbiBsaW5lYWdlYCkKRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX25ld1RheG8kYFNwZWNpZXMgaW4gbGluZWFnZWAgPC0gZ3N1YigiR2xvYm9yb3RhbGlhIHBhY2h5dGhlY2EiLCAiR2xvYm9yb3RhbGlhIHRydW5jYXR1bGlub2lkZXMiLCBGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfbmV3VGF4byRgU3BlY2llcyBpbiBsaW5lYWdlYCkKRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX25ld1RheG8kYFNwZWNpZXMgaW4gbGluZWFnZWAgPC0gZ3N1YigiR2xvYm9yb3RhbGlhIGJlcm11ZGV6aSIsICJHbG9ib3JvdGFsaWEgc2NpdHVsYSIsIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9uZXdUYXhvJGBTcGVjaWVzIGluIGxpbmVhZ2VgKQpGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfbmV3VGF4byRgU3BlY2llcyBpbiBsaW5lYWdlYCA8LSBnc3ViKCJQdWxsZW5pYXRpbmEgZmluYWxpcyIsICJQdWxsZW5pYXRpbmEgb2JsaXF1aWxvY3VsYXRhIiwgRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX25ld1RheG8kYFNwZWNpZXMgaW4gbGluZWFnZWApCmBgYAoKIyMjIENoZWNrIHRoZSByZW1haW5pbmcgbWlzbWF0Y2hlcyBhZnRlciB0aGUgdGF4b25vbWljIHVwZGF0ZS4KCmBgYHtyfQptYXRjaGVkX2Zvc3NpbHNfbmV3VGF4byA8LSBuYW1lcyh3aGljaChzYXBwbHkodW5pcXVlKHRyaXRvbi5wcmVzJHNwZWNpZXMpLCBmdW5jdGlvbihzcCkgYW55KGdyZXBsKHNwLCBGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfbmV3VGF4byRgU3BlY2llcyBpbiBsaW5lYWdlYCkpKSkpCnVubWF0Y2hlZF9mb3NzaWxzX25ld1RheG8gPC0gbmFtZXMod2hpY2goc2FwcGx5KHVuaXF1ZSh0cml0b24ucHJlcyRzcGVjaWVzKSwgZnVuY3Rpb24oc3ApICFhbnkoZ3JlcGwoc3AsIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9uZXdUYXhvJGBTcGVjaWVzIGluIGxpbmVhZ2VgKSkpKSkKbWljcm9wZXJmb3JhdGVzX25ld1RheG8gPC0gdW5pcXVlKHRyaXRvbi5wcmVzW3RyaXRvbi5wcmVzJE1hY3JvLm1pY3JvPT0iTWljcm9wZXJmb3JhdGUiLCJzcGVjaWVzIl0pCnVubWF0Y2hlZF9mb3NzaWxzX290aGVyX25ld1RheG8gPC0gdW5tYXRjaGVkX2Zvc3NpbHNfbmV3VGF4b1shKHVubWF0Y2hlZF9mb3NzaWxzX25ld1RheG8gJWluJSBtaWNyb3BlcmZvcmF0ZXNfbmV3VGF4byldCmMobWF0Y2hlZF9mb3NzaWxzPWxlbmd0aChtYXRjaGVkX2Zvc3NpbHNfbmV3VGF4byksIHVubWF0Y2hlZF9mb3NzaWxzX21pY3JvcGVyZm9yYXRlcz1sZW5ndGgobWljcm9wZXJmb3JhdGVzX25ld1RheG8pLCB1bm1hdGNoZWRfZm9zc2lsc19vdGhlcj1sZW5ndGgodW5tYXRjaGVkX2Zvc3NpbHNfb3RoZXJfbmV3VGF4bykpCgp0cmVlX3NwZWNpZXNfbmV3VGF4byA8LSB1bmlxdWUoUmVkdWNlKGMsc2FwcGx5KEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9uZXdUYXhvJGBTcGVjaWVzIGluIGxpbmVhZ2VgLCBzdHJzcGxpdCwgc3BsaXQ9Ii0iKSkpCm1hdGNoZWRfc3BlY2llc19uZXdUYXhvIDwtIG1hdGNoZWRfZm9zc2lsc19uZXdUYXhvCnVubWF0Y2hlZF9zcGVjaWVzX25ld1RheG8gPC0gdHJlZV9zcGVjaWVzX25ld1RheG9bISh0cmVlX3NwZWNpZXNfbmV3VGF4byAlaW4lIG1hdGNoZWRfZm9zc2lsc19uZXdUYXhvKV0KYyhtYXRjaGVkX3NwZWNpZXM9bGVuZ3RoKG1hdGNoZWRfc3BlY2llc19uZXdUYXhvKSwgdW5tYXRjaGVkX3NwZWNpZXM9bGVuZ3RoKHVubWF0Y2hlZF9zcGVjaWVzX25ld1RheG8pKQoKdHJlZV9saW5lYWdlc19uZXdUYXhvIDwtIHNhcHBseShGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfbmV3VGF4byRgU3BlY2llcyBpbiBsaW5lYWdlYCwgc3Ryc3BsaXQsIHNwbGl0PSItIikKbWF0Y2hlZF9saW5lYWdlc19uZXdUYXhvIDwtIHVuaXF1ZShuYW1lcyh0cmVlX2xpbmVhZ2VzX25ld1RheG8pW3NhcHBseSh0cmVlX2xpbmVhZ2VzX25ld1RheG8sIGZ1bmN0aW9uKHNwZWNpZXNfbmFtZXMpIGFueShzcGVjaWVzX25hbWVzICVpbiUgbWF0Y2hlZF9mb3NzaWxzX25ld1RheG8pKV0pCnVubWF0Y2hlZF9saW5lYWdlc19uZXdUYXhvIDwtIHVuaXF1ZShuYW1lcyh0cmVlX2xpbmVhZ2VzX25ld1RheG8pWyFzYXBwbHkodHJlZV9saW5lYWdlc19uZXdUYXhvLCBmdW5jdGlvbihzcGVjaWVzX25hbWVzKSBhbnkoc3BlY2llc19uYW1lcyAlaW4lIG1hdGNoZWRfZm9zc2lsc19uZXdUYXhvKSldKQpjKG1hdGNoZWRfbGluZWFnZXM9bGVuZ3RoKG1hdGNoZWRfbGluZWFnZXNfbmV3VGF4byksIHVubWF0Y2hlZF9saW5lYWdlcz1sZW5ndGgodW5tYXRjaGVkX2xpbmVhZ2VzX25ld1RheG8pKQpgYGAKCmBgYHtyfQp1bm1hdGNoZWRfZm9zc2lsc19vdGhlcl9uZXdUYXhvCmBgYAoKJFx0byQgRGVudGlnbG9ib3JvdGFsaWEgYW5mcmFjdGEsIEdsb2JpZ2VyaW5lbGxhIG5hdmF6dWVsZW5zaXMgYW5kIEdsb2JvdHVyYm9yb3RhbGl0YSBjYW5jZWxsYXRhIGFyZSBub3QgcmVjb2duaXplZCBhcyBzcGVjaWVzIGluIHRoZSB0cmVlLgoKUmVnYXJkaW5nIEdsb2JvY29uZWxsYSBwc2V1ZG9zcGlub3NhLCBsZXQncyBpbmNsdWRlIGl0IGFmdGVyIEdsb2JvY29uZWxsYSBwdW5jdGljdWxhdGEsIGZvbGxvd2luZyBodHRwczovL3d3dy5taWtyb3RheC5vcmcvcGZvcmFtcy9jYXRhbG9nL0dsb2JvY29uZWxsYV9wc2V1ZG9zcGlub3NhLgoKYGBge3J9CkZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9uZXdUYXhvJGBTcGVjaWVzIGluIGxpbmVhZ2VgIDwtIGdzdWIoIkdsb2JvY29uZWxsYSBzcGhlcmljb21pb3plYS1HbG9ib2NvbmVsbGEgcHVuY3RpY3VsYXRhLUdsb2JvY29uZWxsYSB0cmlhbmd1bGEtR2xvYm9jb25lbGxhIGluZmxhdGEiLCAiR2xvYm9jb25lbGxhIHNwaGVyaWNvbWlvemVhLUdsb2JvY29uZWxsYSBwdW5jdGljdWxhdGEtR2xvYm9jb25lbGxhIHBzZXVkb3NwaW5vc2EtR2xvYm9jb25lbGxhIHRyaWFuZ3VsYS1HbG9ib2NvbmVsbGEgaW5mbGF0YSIsIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9uZXdUYXhvJGBTcGVjaWVzIGluIGxpbmVhZ2VgKQpgYGAKCmBgYHtyfQpGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfbmV3VGF4b1tGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfbmV3VGF4byRgU3BlY2llcyBpbiBsaW5lYWdlYCAlaW4lIHVubWF0Y2hlZF9saW5lYWdlc19uZXdUYXhvLF0KYGBgCgpgYGB7cn0KIyBNZXJnZSBtb3JwaG9zcGVjaWVzIHRoYXQgYXBwZWFyIHNldmVyYWwgdGltZXMgaW4gdGhlIHNhbWUgbGluZWFnZSBkdWUgdG8gdGhlIHRheG9ub21pYyB1cGRhdGUKRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX25ld1RheG8kYFNwZWNpZXMgaW4gbGluZWFnZWAgPC0gc2FwcGx5KEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9uZXdUYXhvJGBTcGVjaWVzIGluIGxpbmVhZ2VgLCBmdW5jdGlvbihzcGVjaWVzX2luX2xpbilwYXN0ZSh1bmlxdWUoc3Ryc3BsaXQoc3BlY2llc19pbl9saW4sICItIilbWzFdXSksIGNvbGxhcHNlID0gIi0iKSkKYGBgCgpTYXZlIHRoZSB0cmVlIHdpdGggdGhlIG5ldyB0YXhvbm9teS4KCmBgYHtyfQp3cml0ZS5jc3YoRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX25ld1RheG8sICIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL01vcnBob3NwZWNpZXNfcGh5bG9nZW5pZXMvRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX25ld1RheG8uY3N2Iiwgcm93Lm5hbWVzPUYpCmBgYAoKIyMjIEFkZCBUcml0b24gZm9zc2lscyBpbiBBemUgdHJlZQoKYGBge3J9CnRyaXRvbi5zcyA8LSByZWFkLmNzdigiLi4vLi4vMy1EYXRhX3Byb2Nlc3NlZC9Ucml0b25fb2NjdXJyZW5jZXMvVHJpdG9uREJfc3Vic2FtcGxlZF9TVFRfOTEyNTNmb3NzLmNzdiIsIHJvdy5uYW1lcyA9IDEpCmhlYWQodHJpdG9uLnNzKQpgYGAKCmBgYHtyfQojIyMgVXBkYXRlIHRoZSB0YXhvbm9teSBiYXNlZCBvbiBtb2Rlcm4gc3BlY2llcwojIyBTcGlub3NlCiN0cml0b24uc3Mkc3BlY2llcyA8LSBnc3ViKCJHbG9iaWdlcmlub2lkZXMgcnViZXIiLCAiR2xvYmlnZXJpbm9pZGVzIHJ1YmVyLWFsYnVzIiwgdHJpdG9uLnNzJHNwZWNpZXMpCnRyaXRvbi5zcyRzcGVjaWVzIDwtIGdzdWIoIkJlZWxsYSBtZWdhc3RvbWEiLCAiQmVlbGxhIGRpZ2l0YXRhIiwgdHJpdG9uLnNzJHNwZWNpZXMpCnRyaXRvbi5zcyRzcGVjaWVzIDwtIGdzdWIoIkdsb2JvdHVyYm9yb3RhbGl0YSB0ZW5lbGxhIiwgIkdsb2JpZ2VyaW5vaWRlcyB0ZW5lbGx1cyIsIHRyaXRvbi5zcyRzcGVjaWVzKQp0cml0b24uc3Mkc3BlY2llcyA8LSBnc3ViKCJUcmlsb2JhdHVzIGltbWF0dXJ1cyIsICJUcmlsb2JhdHVzIHNhY2N1bGlmZXIiLCB0cml0b24uc3Mkc3BlY2llcykKdHJpdG9uLnNzJHNwZWNpZXMgPC0gZ3N1YigiVHJpbG9iYXR1cyBxdWFkcmlsb2JhdHVzIiwgIlRyaWxvYmF0dXMgc2FjY3VsaWZlciIsIHRyaXRvbi5zcyRzcGVjaWVzKQp0cml0b24uc3Mkc3BlY2llcyA8LSBnc3ViKCJUcmlsb2JhdHVzIHRyaWxvYnVzIiwgIlRyaWxvYmF0dXMgc2FjY3VsaWZlciIsIHRyaXRvbi5zcyRzcGVjaWVzKQp0cml0b24uc3Mkc3BlY2llcyA8LSBnc3ViKCJUdXJib3JvdGFsaXRhIGNyaXN0YXRhIiwgIlR1cmJvcm90YWxpdGEgaHVtaWxpcyIsIHRyaXRvbi5zcyRzcGVjaWVzKQoKIyMgTm9uLXNwaW5vc2UKdHJpdG9uLnNzJHNwZWNpZXMgPC0gZ3N1YigiVHJ1bmNvcm90YWxpYSIsICJHbG9ib3JvdGFsaWEiLCB0cml0b24uc3Mkc3BlY2llcykKdHJpdG9uLnNzJHNwZWNpZXMgPC0gZ3N1YigiTWVuYXJkZWxsYSIsICJHbG9ib3JvdGFsaWEiLCB0cml0b24uc3Mkc3BlY2llcykKdHJpdG9uLnNzJHNwZWNpZXMgPC0gZ3N1YigiSGlyc3V0ZWxsYSIsICJHbG9ib3JvdGFsaWEiLCB0cml0b24uc3Mkc3BlY2llcykKdHJpdG9uLnNzJHNwZWNpZXMgPC0gZ3N1YigiR2xvYm9jb25lbGxhIiwgIkdsb2Jvcm90YWxpYSIsIHRyaXRvbi5zcyRzcGVjaWVzKQp0cml0b24uc3Mkc3BlY2llcyA8LSBnc3ViKCJHbG9ib3JvdGFsaWEgdGhleWVyaSIsICJHbG9ib3JvdGFsaWEgZWFzdHJvcGFjaWEiLCB0cml0b24uc3Mkc3BlY2llcykKdHJpdG9uLnNzJHNwZWNpZXMgPC0gZ3N1YigiR2xvYm9yb3RhbGlhIG9jZWFuaWNhIiwgIkdsb2Jvcm90YWxpYSBjcmFzc2Fmb3JtaXMiLCB0cml0b24uc3Mkc3BlY2llcykKdHJpdG9uLnNzJHNwZWNpZXMgPC0gZ3N1YigiR2xvYm9yb3RhbGlhIGV4Y2Vsc2EiLCAiR2xvYm9yb3RhbGlhIHRydW5jYXR1bGlub2lkZXMiLCB0cml0b24uc3Mkc3BlY2llcykKdHJpdG9uLnNzJHNwZWNpZXMgPC0gZ3N1YigiR2xvYm9yb3RhbGlhIHBhY2h5dGhlY2EiLCAiR2xvYm9yb3RhbGlhIHRydW5jYXR1bGlub2lkZXMiLCB0cml0b24uc3Mkc3BlY2llcykKdHJpdG9uLnNzJHNwZWNpZXMgPC0gZ3N1YigiR2xvYm9yb3RhbGlhIGJlcm11ZGV6aSIsICJHbG9ib3JvdGFsaWEgc2NpdHVsYSIsIHRyaXRvbi5zcyRzcGVjaWVzKQp0cml0b24uc3Mkc3BlY2llcyA8LSBnc3ViKCJQdWxsZW5pYXRpbmEgZmluYWxpcyIsICJQdWxsZW5pYXRpbmEgb2JsaXF1aWxvY3VsYXRhIiwgdHJpdG9uLnNzJHNwZWNpZXMpCgojIE1pY3JvcGVyZm9yYXRlCnRyaXRvbi5zcyRzcGVjaWVzIDwtIGdzdWIoIlRlbnVpdGVsbGEgaW90YSIsICJUZW51aXRlbGxpdGEgaW90YSIsIHRyaXRvbi5zcyRzcGVjaWVzKQp0cml0b24uc3Mkc3BlY2llcyA8LSBnc3ViKCJHbG9iaWdlcmluaXRhIHBhcmtlcmFlIiwgIlRlbnVpdGVsbGl0YSBmbGVpc2hlcmkiLCB0cml0b24uc3Mkc3BlY2llcykKdHJpdG9uLnNzJHNwZWNpZXMgPC0gZ3N1YigiVGVudWl0ZWxsYSBwYXJrZXJhZSIsICJUZW51aXRlbGxpdGEgcGFya2VyYWUiLCB0cml0b24uc3Mkc3BlY2llcykKCiMgSW5kZXBlbmRlbnQgcGxhbmt0b25pYyBvcmlnaW4KdHJpdG9uLnNzJHNwZWNpZXMgPC0gZ3N1YigiR2FsbGl0ZWxsaWEgdml2YW5zIiwgIk5lb2dhbGxpdGVsbGlhIHZpdmFucyIsIHRyaXRvbi5zcyRzcGVjaWVzKQp0cml0b24uc3Mkc3BlY2llcyA8LSBnc3ViKCJTdHJlcHRvY2hpbHVzIGdsb2JpZ2VydW0iLCAiQm9saXZpbmEgdmFyaWFiaWxpcyIsIHRyaXRvbi5zcyRzcGVjaWVzKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0xMiwgZmlnLmFzcCA9IC44fQpGb3JhbV9waHlsb19mb3NzaWxzIDwtIEZvcmFtX3BoeWxvX3VwZGF0ZWQKRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX2Zvc3NpbHMgPC0gRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX25ld1RheG8KI25iRiA8LSA1MDAwCm5iRiA8LSAxMDAwCm5iRl9jcHQgPC0gMApmb3IgKGkgaW4gc2FtcGxlKDE6bnJvdyh0cml0b24uc3MpLCBzaXplPW1pbihuYkYqMiwgbnJvdyh0cml0b24uc3MpKSwgcmVwbGFjZT1GKSl7CiNmb3IgKGkgaW4gMTpucm93KHRyaXRvbi5zcykpewogIEZpIDwtIHRyaXRvbi5zc1tpLF0KICBjb25kIDwtIGdyZXBsKEZpJHNwZWNpZXMsIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9mb3NzaWxzJGBTcGVjaWVzIGluIGxpbmVhZ2VgKSAmIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9mb3NzaWxzJGBTdGFydCBkYXRlYD5GaSRhZ2VfcnVuaWYgJiBGaSRhZ2VfcnVuaWYgPiBGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfZm9zc2lscyRgRW5kIGRhdGVgCiAgCiAgaWYgKGFueShjb25kKSkgewogICAgdHJpdG9uX3RvX0F6ZV9GaSA8LSBGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfZm9zc2lsc1tzYW1wbGUoMTpsZW5ndGgoY29uZCksIDEsIHByb2IgPSBjb25kKSxdCiAgICAKICAgIG1hdGNoZWRfZm9zc2lscyA8LSB1bmlvbihtYXRjaGVkX2Zvc3NpbHMsIEZpJHNwZWNpZXMpCiAgICBGaSRjb2RlIDwtIHRyaXRvbl90b19BemVfRmkkYExpbmVhZ2UgY29kZWAKICAgIEZpJGxhYmVsIDwtIHBhc3RlMCgiRiIsaSkKICAgIEZpJHBvc2l0aW9uIDwtIEZpJGFnZV9ydW5pZiAtIHRyaXRvbl90b19BemVfRmkkYEVuZCBkYXRlYAoKICAgIGlmIChncmVwbCgiVCIsRmkkY29kZSkpIEZvcmFtX3BoeWxvX2Zvc3NpbHMgPC0gYWRkLmludGVybmFsLmZvc3NpbChGb3JhbV9waHlsb19mb3NzaWxzLCB3aGVyZS50aXA9RmkkY29kZSwgbm9kZS5sYWJlbD1GaSRsYWJlbCwgcG9zaXRpb249RmkkcG9zaXRpb24pCiAgICBlbHNlIEZvcmFtX3BoeWxvX2Zvc3NpbHMgPC0gYWRkLmludGVybmFsLmZvc3NpbChGb3JhbV9waHlsb19mb3NzaWxzLCB3aGVyZS5ub2RlPUZpJGNvZGUsIG5vZGUubGFiZWw9RmkkbGFiZWwsIHBvc2l0aW9uPUZpJHBvc2l0aW9uKQogICAgCiAgICAjIEFkZCB0aGUgbmV3IGFuY2VzdHJ5IHJlbGF0aW9uc2hpcCBpbiB0aGUgdGFibGUKICAgIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9mb3NzaWxzW2NvbmQsIlN0YXJ0IGRhdGUiXSA8LSB0cml0b25fdG9fQXplX0ZpJGBFbmQgZGF0ZWAgPC0gRmkkYWdlX3J1bmlmCiAgICBGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfZm9zc2lsc1tjb25kLCJBbmNlc3RvciBjb2RlIl0gPC0gdHJpdG9uX3RvX0F6ZV9GaSRgTGluZWFnZSBjb2RlYCA8LSBGaSRsYWJlbAogICAgRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX2Zvc3NpbHMgPC0gcmJpbmQoRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX2Zvc3NpbHMsIHRyaXRvbl90b19BemVfRmkpCiAgICBuYkZfY3B0IDwtIG5iRl9jcHQgKyAxCiAgICBpZiAobmJGX2NwdD09bmJGKSBicmVhawogIH0KfQpgYGAKCmBgYHtyIGZpZy53aWR0aD0yMCwgZmlnLmFzcCA9IC44fQpwIDwtIGdndHJlZShGb3JhbV9waHlsb191cGRhdGVkKSArICBnZW9tX3RpcGxhYihzaXplPTIuNSkgKyBnZW9tX25vZGVsYWIoc2l6ZT0yKSArIHRoZW1lX3RyZWUyKCkKcSA8LSBnZ3RyZWUoRm9yYW1fcGh5bG9fZm9zc2lscykgKyAKICBnZW9tX3RpcGxhYihzaXplPTIuNSkgKyB0aGVtZV90cmVlMigpICsKICBnZW9tX25vZGVsYWIoc2l6ZT0yLCAKICAgICAgICAgICAgICAgbnVkZ2VfeT1hcy5udW1lcmljKGxpc3QoIkZBTFNFIj0wLCJUUlVFIj0wLjUpW2FzLmNoYXJhY3RlcihncmVwbCgiRiIsYyhGb3JhbV9waHlsb19mb3NzaWxzJG5vZGUubGFiZWwpKSldKSwgCiAgICAgICAgICAgICAgIGNvbG91cj1hcy5jaGFyYWN0ZXIobGlzdCgiRkFMU0UiPSdibGFjaycsIlRSVUUiPSJyZWQiKVthcy5jaGFyYWN0ZXIoZ3JlcGwoIkYiLGMoRm9yYW1fcGh5bG9fZm9zc2lscyRub2RlLmxhYmVsKSkpXSkpCnJldnRzKHApCnJldnRzKHEpCmBgYAoKYGBge3J9CkZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9mb3NzaWxzW0ZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9mb3NzaWxzJGBTdGFydCBkYXRlYC1Gb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfZm9zc2lscyRgRW5kIGRhdGVgPjEwLF0Kd3JpdGUuY3N2KEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9mb3NzaWxzW0ZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9mb3NzaWxzJGBTdGFydCBkYXRlYC1Gb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfZm9zc2lscyRgRW5kIGRhdGVgPjEwLF0sCiAgICAgICAgICBwYXN0ZTAoIi4uLy4uLzMtRGF0YV9wcm9jZXNzZWQvTW9ycGhvc3BlY2llc19waHlsb2dlbmllcy9Gb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfIiwgbmJGLCAiZm9zc2lsc18xME15ckdhcHMuY3N2IikpCndyaXRlLmNzdihGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfZm9zc2lsc1tGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfZm9zc2lscyRgU3RhcnQgZGF0ZWAtRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX2Zvc3NpbHMkYEVuZCBkYXRlYD41LF0sIAogICAgICAgICAgcGFzdGUwKCIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL01vcnBob3NwZWNpZXNfcGh5bG9nZW5pZXMvRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiXyIsIG5iRiwgImZvc3NpbHNfNU15ckdhcHMuY3N2IikpCndyaXRlLmNzdihGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfZm9zc2lscywgCiAgICAgICAgICBwYXN0ZTAoIi4uLy4uLzMtRGF0YV9wcm9jZXNzZWQvTW9ycGhvc3BlY2llc19waHlsb2dlbmllcy9Gb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfIiwgbmJGLCAiZm9zc2lscy5jc3YiKSkKYGBgCgpgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5hc3AgPSAuM30KRm9yYW1fYW5jZXN0cnlfdGFibGVfYWxiX2Zvc3NpbHNbZ3JlcGwoIkdsb2Jvcm90YWxvaWRlcyBlb3ZhcmlhYmlsaXMiLCBGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfZm9zc2lscyRgU3BlY2llcyBpbiBsaW5lYWdlYCksXQoKZ2dwbG90KHRyaXRvbi5wcmVzW3RyaXRvbi5wcmVzJHNwZWNpZXM9PSJHbG9ib3JvdGFsb2lkZXMgZW92YXJpYWJpbGlzIixdLCBhZXMoeD1hZ2VfcnVuaWYsIGZpbGw9YWdlX3J1bmlmPFNwZWNpYXRpb24pKSArIAogIGdlb21faGlzdG9ncmFtKGJpbnMgPSA2MCkgKwogIGdlb21fdmxpbmUobGluZXR5cGU9ImRhc2hlZCIsIGFlcyh4aW50ZXJjZXB0ID0gU3BlY2lhdGlvbiwgY29sb3I9IlNwZWNpYXRpb24iKSkgKwogIGdlb21fdmxpbmUobGluZXR5cGU9ImRhc2hlZCIsIGFlcyh4aW50ZXJjZXB0ID0gRXh0aW5jdGlvbiwgY29sb3I9IkV4dGluY3Rpb24iKSkgKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSAwLCBjb2xvcj0iTGluZWFnZSBleHRpbmN0aW9uIikpICsKICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gNDQuNSwgY29sb3I9IkxpbmVhZ2Ugb3JpZ2luYXRpb24iKSkgCmBgYAoKYGBge3IgZmlnLndpZHRoPTIwLCBmaWcuYXNwID0gLjZ9CkZvcmFtX3BoeWxvX2Zvc3NpbHNfcmVjb25zdHJ1Y3RlZCA8LSBGb3JhbV9waHlsb19mb3NzaWxzCmZvciAodGlwX2xhYiBpbiBGb3JhbV9waHlsb19mb3NzaWxzJHRpcC5sYWJlbFtwYWxlb3RyZWU6OmRhdGVOb2RlcyhGb3JhbV9waHlsb19mb3NzaWxzLCByb290QWdlPUZvc3NpbFNpbTo6dHJlZS5tYXgoRm9yYW1fcGh5bG9fZm9zc2lscykpWzE6TnRpcChGb3JhbV9waHlsb19mb3NzaWxzKV0gPiAxZS02XSl7CiAgRm9yYW1fcGh5bG9fZm9zc2lsc19yZWNvbnN0cnVjdGVkIDwtIGRyb3AudGlwKEZvcmFtX3BoeWxvX2Zvc3NpbHNfcmVjb25zdHJ1Y3RlZCwgdGlwX2xhYiwgdHJpbS5pbnRlcm5hbD1GLCBjb2xsYXBzZS5zaW5nbGVzPUYpCn0KCmdndHJlZShGb3JhbV9waHlsb19mb3NzaWxzX3JlY29uc3RydWN0ZWQpICsgCiAgZ2VvbV90aXBsYWIoc2l6ZT0yLjUsIGNvbG9yPSJibHVlIikgKwogIGdlb21fbm9kZWxhYihzaXplPTIsIAogICAgICAgICAgICAgICBudWRnZV95PWFzLm51bWVyaWMobGlzdCgiRkFMU0UiPTAsIlRSVUUiPTAuNSlbYXMuY2hhcmFjdGVyKGdyZXBsKCJGIixjKEZvcmFtX3BoeWxvX2Zvc3NpbHNfcmVjb25zdHJ1Y3RlZCRub2RlLmxhYmVsKSkpXSksIAogICAgICAgICAgICAgICBjb2xvdXI9YXMuY2hhcmFjdGVyKGxpc3QoIkZBTFNFIj0nYmxhY2snLCJUUlVFIj0iZGFya3JlZCIpW2FzLmNoYXJhY3RlcihncmVwbCgiRiIsYyhGb3JhbV9waHlsb19mb3NzaWxzX3JlY29uc3RydWN0ZWQkbm9kZS5sYWJlbCkpKV0pKQpgYGAKCmBgYHtyfQp3cml0ZS50cmVlKEZvcmFtX3BoeWxvX2Zvc3NpbHNfcmVjb25zdHJ1Y3RlZCwgcGFzdGUwKCIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL01vcnBob3NwZWNpZXNfcGh5bG9nZW5pZXMvRm9yYW1zXyIsIG5iRiwgImZvc3MudHJlZSIpKQp3cml0ZS5uZXh1cyhGb3JhbV9waHlsb19mb3NzaWxzX3JlY29uc3RydWN0ZWQsIGZpbGU9cGFzdGUwKCIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL01vcnBob3NwZWNpZXNfcGh5bG9nZW5pZXMvRm9yYW1zXyIsIG5iRiwgImZvc3MubmV4IikpCmBgYAoKIyBTcGxpdCBpbnRvIG1vbm9waHlsZXRpYyBwaHlsb2dlbmllcwoKYGBge3J9CiMgTG9hZCB0aGUgZm9yYW1pbmlmZXJhIG1vbm9waHlsZXRpYyBncm91cHMgb2YgYWxsIGdlbmVyYSwgZGVzY3JpYmVkIGJ5IHRoZWlyIHdhbGwgdGV4dHVyZQp3YWxsX3RleHR1cmVzIDwtIHJlYWQuY3N2KCIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL1RyaXRvbl9vY2N1cnJlbmNlcy93YWxsX3RleHR1cmVzLmNzdiIpCm5hbWVzKHdhbGxfdGV4dHVyZXMpIDwtIGMoIkdlbnVzIiwgIk1vcnBob2xvZ3kiKQp3YWxsX3RleHR1cmVzCmBgYAoKIyMgRGlzcGxheSB0aGUgd2FsbCB0ZXh0dXJlIG9uIHRoZSBmdWxsIHBoeWxvZ2VueQoKYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuYXNwPTEuMn0KIyBFeHRyYWN0IGdlbnVzLCBmaXJzdCBhbmQgbGFzdCBzcGVjaWVzLCBhbmQgRW5kIGRhdGUKbGluZWFnZV9pbmZvIDwtIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9uZXdUYXhvICU+JQogIHNlbGVjdChgTGluZWFnZSBjb2RlYCwgYFNwZWNpZXMgaW4gbGluZWFnZWAsIGBFbmQgZGF0ZWApICU+JQogIG11dGF0ZSgKICAgICMgRmlyc3Qgc3BlY2llcyAoYWxyZWFkeSBwcmVzZW50IGJ1dCBrZXB0IGZvciByZWZlcmVuY2UpCiAgICBGaXJzdF9zcGVjaWVzID0gc2FwcGx5KGBTcGVjaWVzIGluIGxpbmVhZ2VgLCBmdW5jdGlvbih4KSBzdHJzcGxpdCh4LCItIilbWzFdXVsxXSksCiAgICAjIExhc3Qgc3BlY2llcyBpbiB0aGUgbGluZWFnZQogICAgTGFzdF9zcGVjaWVzID0gc2FwcGx5KGBTcGVjaWVzIGluIGxpbmVhZ2VgLCBmdW5jdGlvbih4KSB7CiAgICAgIHNwX2xpc3QgPC0gc3Ryc3BsaXQoeCwgIi0iKVtbMV1dCiAgICAgIHNwX2xpc3RbbGVuZ3RoKHNwX2xpc3QpXQogICAgfSksCiAgICBHZW51cyA9IHNhcHBseShGaXJzdF9zcGVjaWVzLCBmdW5jdGlvbih5KSBzdHJzcGxpdCh5LCAiICIpW1sxXV1bMV0pCiAgKSAlPiUKICAjIE1lcmdlIHdpdGggd2FsbCB0ZXh0dXJlcwogIGxlZnRfam9pbih3YWxsX3RleHR1cmVzLCBieT0iR2VudXMiKQoKIyBDb21iaW5lIHRpcCBsYWJlbHMgd2l0aCBsaW5lYWdlIGluZm8KdGlwX2RhdGEgPC0gZGF0YS5mcmFtZShsYWJlbCA9IEZvcmFtX3BoeWxvX2Zvc3NpbHMkdGlwLmxhYmVsLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpICU+JQogIGxlZnRfam9pbihsaW5lYWdlX2luZm8sIGJ5ID0gYygibGFiZWwiID0gIkxpbmVhZ2UgY29kZSIpKQoKIyBQbG90IHRoZSB0cmVlIGFuZCBjb2xvciB0aXBzIGJ5IE1vcnBob2xvZ3kKIyBBZGQgbGFzdCBzcGVjaWVzIG5hbWVzIHRvIGV4dGFudCB0aXBzIG9ubHkgKEVuZCBkYXRlID09IDApCiMgcCA8LSBnZ3RyZWUoRm9yYW1fcGh5bG9fZm9zc2lscykgJTwrJSB0aXBfZGF0YSArCiMgICBnZW9tX3RpcHBvaW50KGFlcyhjb2xvcj1Nb3JwaG9sb2d5KSwgc2l6ZT0yKSArIAojICAgZ2VvbV90aXBsYWIoYWVzKGxhYmVsID0gaWZlbHNlKGBFbmQgZGF0ZWAgPT0gMCwgTGFzdF9zcGVjaWVzLCAiIikpLCBzaXplPTIsIGhqdXN0PS0wLjA1KSArIAojICAgeGxpbV90cmVlKDYpICsKIyAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJTcGlub3NlIiA9ICJzYWxtb24iLCAiTm9uLXNwaW5vc2UiID0gImN5YW4zIikpICsKIyAgIHRoZW1lX3RyZWUyKCkgKyAKIyAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJpbnNpZGUiLCBsZWdlbmQucG9zaXRpb24uaW5zaWRlID0gYygwLjgsMC42KSwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTMpKQoKbm9kZV9OU29ubHkgPC0gbGVuZ3RoKEZvcmFtX3BoeWxvX2Zvc3NpbHMkdGlwLmxhYmVsKSArIHdoaWNoKEZvcmFtX3BoeWxvX2Zvc3NpbHMkbm9kZS5sYWJlbCA9PSAiTjE5OCIpCm5vZGVfTWl4ZWRTIDwtIGxlbmd0aChGb3JhbV9waHlsb19mb3NzaWxzJHRpcC5sYWJlbCkgKyB3aGljaChGb3JhbV9waHlsb19mb3NzaWxzJG5vZGUubGFiZWwgPT0gIk4xODIiKQpub2RlX1Nvbmx5IDwtIGxlbmd0aChGb3JhbV9waHlsb19mb3NzaWxzJHRpcC5sYWJlbCkgICsgd2hpY2goRm9yYW1fcGh5bG9fZm9zc2lscyRub2RlLmxhYmVsID09ICJOMjU3IikKdHJlZV9oZWlnaHQgPC0gbWF4KG5vZGVIZWlnaHRzKEZvcmFtX3BoeWxvX2Zvc3NpbHMpKQoKcCA8LSBnZ3RyZWUoRm9yYW1fcGh5bG9fZm9zc2lscykKIyBGb3IgZWFjaCBub2RlLCBjb3VudCBob3cgbWFueSB0aW1lcyBpdCBhcHBlYXJzIGFzIGEgcGFyZW50IGFuZCBmbGFnIG5vbi10aXAgbm9kZXMgd2l0aCBleGFjdGx5IG9uZSBjaGlsZCBhcyBzYW1wbGVkIGFuY2VzdG9ycwpwJGRhdGEkc2FtcGxlZEFuY2VzdG9yIDwtICFkJGlzVGlwICYgKHNhcHBseShkJG5vZGUsIGZ1bmN0aW9uKHgpIHN1bShkJHBhcmVudCA9PSB4KSkgPT0gMSkKcSA8LSBwICU8KyUgdGlwX2RhdGEgKwogICMgTm9uLVNwaW5vc2Ugb25seQogIGdlb21faGlsaWdodChub2RlID0gbm9kZV9OU29ubHksIGZpbGwgPSAgImN5YW4zIiwgYWxwaGEgPSAwLjMsIHR5cGU9ImdyYWRpZW50IikgKwogIGFubm90YXRlKCJMYWJlbCIsIGxhYmVsID0gIk5vbi1TcGlub3NlIE9ubHkiLCB4PTE0LCB5PTE3OSwgY29sb3VyID0gImN5YW40Iiwgc2l6ZSA9IHVuaXQoNywgInB0IiksIGZpbGw9TkEpICsKICAjIE1peGVkIFNwaW5vc2UKICBnZW9tX2hpbGlnaHQobm9kZSA9IG5vZGVfTWl4ZWRTLCBmaWxsID0gIiM3REE3QTBGRiIsIGFscGhhID0gMC4zLCB0eXBlPSJncmFkaWVudCIpICsKICBhbm5vdGF0ZSgiTGFiZWwiLCBsYWJlbCA9ICJNaXhlZCBTcGlub3NlIiwgeD0xMy41LCB5PTEwMCwgY29sb3VyID0gIiM3RTkwQTBGRiIsIHNpemUgPSB1bml0KDcsICJwdCIpLCBmaWxsPU5BKSArCiAgIyBTcGlub3NlIG9ubHkKICBnZW9tX2hpbGlnaHQobm9kZSA9IG5vZGVfU29ubHksIGZpbGwgPSAic2FsbW9uIiwgYWxwaGEgPSAwLjMsIHR5cGU9ImdyYWRpZW50IikgKwogIGFubm90YXRlKCJMYWJlbCIsIGxhYmVsID0gIlNwaW5vc2UgT25seSIsIHg9MTIsIHk9NTYsIGNvbG91ciA9ICJzYWxtb240Iiwgc2l6ZSA9IHVuaXQoNywgInB0IiksIGZpbGw9TkEpICsKICBnZW9tX3RpcHBvaW50KGFlcyhjb2xvciA9IE1vcnBob2xvZ3kpLCBzaXplID0gMikgKyAKICBnZW9tX3RpcGxhYihhZXMobGFiZWwgPSBpZmVsc2UoYEVuZCBkYXRlYCA9PSAwLCBMYXN0X3NwZWNpZXMsICIiKSksIHNpemUgPSAyLCBoanVzdCA9IC0wLjA1KSArIAogIGdlb21fcG9pbnQyKGFlcyhzdWJzZXQgPSAhaXNUaXAgJiBzYW1wbGVkQW5jZXN0b3IpLCBzaGFwZSA9ICJJIiwgc2l6ZSA9IDIsIGNvbG9yID0gImRhcmtyZWQiKSArCiAgeGxpbV90cmVlKDc1KSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSh0cmVlX2hlaWdodCwgLTEsIGJ5ID0gLTEwKSwgbGFiZWxzID0gZnVuY3Rpb24oeCkgdHJlZV9oZWlnaHQgLSB4KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIlNwaW5vc2UiID0gInNhbG1vbiIsICJOb24tc3Bpbm9zZSIgPSAiY3lhbjMiKSkgKwogIHRoZW1lX3RyZWUyKCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiaW5zaWRlIiwgbGVnZW5kLnBvc2l0aW9uLmluc2lkZSA9ICBjKDAuOSwwLjU3KSwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpCgpyIDwtIHAgJTwrJSB0aXBfZGF0YSArCiAgIyBOb24tU3Bpbm9zZSBvbmx5CiAgZ2VvbV9oaWxpZ2h0KG5vZGUgPSBub2RlX05Tb25seSwgZmlsbCA9ICAiY3lhbjMiLCBhbHBoYSA9IDAuMywgdHlwZT0iZ3JhZGllbnQiKSArCiAgYW5ub3RhdGUoIkxhYmVsIiwgbGFiZWwgPSAiTm9uLVNwaW5vc2UgT25seSIsIHg9MTQsIHk9MTc5LCBjb2xvdXIgPSAiY3lhbjQiLCBzaXplID0gdW5pdCg3LCAicHQiKSwgZmlsbD1OQSkgKwogICMgTWl4ZWQgU3Bpbm9zZQogIGdlb21faGlsaWdodChub2RlID0gbm9kZV9NaXhlZFMsIGZpbGwgPSAiIzdEQTdBMEZGIiwgYWxwaGEgPSAwLjMsIHR5cGU9ImdyYWRpZW50IikgKwogIGFubm90YXRlKCJMYWJlbCIsIGxhYmVsID0gIk1peGVkIFNwaW5vc2UiLCB4PTEzLjUsIHk9MTAwLCBjb2xvdXIgPSAiIzdFOTBBMEZGIiwgc2l6ZSA9IHVuaXQoNywgInB0IiksIGZpbGw9TkEpICsKICAjIFNwaW5vc2Ugb25seQogIGdlb21faGlsaWdodChub2RlID0gbm9kZV9Tb25seSwgZmlsbCA9ICJzYWxtb24iLCBhbHBoYSA9IDAuMywgdHlwZT0iZ3JhZGllbnQiKSArCiAgYW5ub3RhdGUoIkxhYmVsIiwgbGFiZWwgPSAiU3Bpbm9zZSBPbmx5IiwgeD0xMiwgeT01NiwgY29sb3VyID0gInNhbG1vbjQiLCBzaXplID0gdW5pdCg3LCAicHQiKSwgZmlsbD1OQSkgKwogIGdlb21fdGlwcG9pbnQoYWVzKGNvbG9yPU1vcnBob2xvZ3kpLCBzaXplPTIpICsgCiAgZ2VvbV90aXBsYWIoYWVzKGxhYmVsID0gTGFzdF9zcGVjaWVzKSwgc2l6ZT0yLCBoanVzdD0tMC4wNSkgKwogIGdlb21fcG9pbnQyKGFlcyhzdWJzZXQgPSAoIWlzVGlwICYgc2FtcGxlZEFuY2VzdG9yKSksIHNoYXBlID0gIkkiLCBzaXplID0gMiwgY29sb3IgPSAiZGFya3JlZCIpICsKICB4bGltX3RyZWUoNzUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKHRyZWVfaGVpZ2h0LCAtMSwgYnkgPSAtMTApLCBsYWJlbHMgPSBmdW5jdGlvbih4KSB0cmVlX2hlaWdodCAtIHgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiU3Bpbm9zZSIgPSAic2FsbW9uIiwgIk5vbi1zcGlub3NlIiA9ICJjeWFuMyIpKSArCiAgdGhlbWVfdHJlZTIoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJpbnNpZGUiLCBsZWdlbmQucG9zaXRpb24uaW5zaWRlID0gYygwLjksMC41NyksIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEzKSkKCmdnc2F2ZSgiLi4vLi4vMy1EYXRhX3Byb2Nlc3NlZC9Nb3JwaG9zcGVjaWVzX3BoeWxvZ2VuaWVzL0ltYWdlcy9Gb3JhbV9waHlsb193YWxsdGV4dHVyZS5wZGYiLCByLCB3aWR0aCA9IDEyLCBoZWlnaHQgPSAxNCkKcQpyCmBgYAoKYGBge3J9CiMgQ3JlYXRlIGEgZ2d0cmVlIG9iamVjdCBhbmQgZXh0cmFjdCBpdHMgZGF0YQpwIDwtIGdndHJlZShGb3JhbV9waHlsb19mb3NzaWxzKQoKIyBGb3IgZWFjaCBub2RlLCBjb3VudCBob3cgbWFueSB0aW1lcyBpdCBhcHBlYXJzIGFzIGEgcGFyZW50IGFuZCBmbGFnIG5vbi10aXAgbm9kZXMgd2l0aCBleGFjdGx5IG9uZSBjaGlsZCBhcyBzYW1wbGVkIGFuY2VzdG9ycwpwJGRhdGEkY2hpbGRfY291bnQgPC0gc2FwcGx5KGQkbm9kZSwgZnVuY3Rpb24oeCkgc3VtKGQkcGFyZW50ID09IHgpKQpwJGRhdGEkc2FtcGxlZEFuY2VzdG9yIDwtICFkJGlzVGlwICYgKGQkY2hpbGRfY291bnQgPT0gMSkKYGBgCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC44fQpub2RlX05vblNwaW5vc2VPbmx5IDwtICJOMTk4Igpub2RlX1NwaW5vc2VPbmx5IDwtICJOMjU3Igpub2RlX01peGVkU3Bpbm9zZSA8LSAiTjE4MiIKCiMgRXh0cmFjdCBvbmUgY2xhZGUgZnJvbSB0aGF0IG5vZGUKUGh5bG9fTm9uU3Bpbm9zZU9ubHkgPC0gZXh0cmFjdC5jbGFkZShGb3JhbV9waHlsb191cGRhdGVkLCBub2RlID0gbm9kZV9Ob25TcGlub3NlT25seSwgcm9vdC5lZGdlID0gMSkKUGh5bG9fU3Bpbm9zZU9ubHkgPC0gZXh0cmFjdC5jbGFkZShGb3JhbV9waHlsb191cGRhdGVkLCBub2RlID0gbm9kZV9TcGlub3NlT25seSwgcm9vdC5lZGdlID0gMSkKUGh5bG9fTWl4ZWRTcGlub3NlIDwtIGV4dHJhY3QuY2xhZGUoRm9yYW1fcGh5bG9fdXBkYXRlZCwgbm9kZSA9IG5vZGVfTWl4ZWRTcGlub3NlLCByb290LmVkZ2UgPSAxKQoKIyBBZGQgbW9ycGhvbG9naWNhbCBpbmZvcm1hdGlvbgpQaHlsb19Ob25TcGlub3NlT25seV9kYXRhIDwtICBkYXRhLmZyYW1lKGxhYmVsID0gUGh5bG9fTm9uU3Bpbm9zZU9ubHkkdGlwLmxhYmVsLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpICU+JSBsZWZ0X2pvaW4odGlwX2RhdGEsIGJ5ID0gImxhYmVsIikKUGh5bG9fU3Bpbm9zZU9ubHlfZGF0YSA8LSBkYXRhLmZyYW1lKGxhYmVsID0gUGh5bG9fU3Bpbm9zZU9ubHkkdGlwLmxhYmVsLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpICU+JSBsZWZ0X2pvaW4odGlwX2RhdGEsIGJ5ID0gImxhYmVsIikKUGh5bG9fTWl4ZWRTcGlub3NlX2RhdGEgPC0gZGF0YS5mcmFtZShsYWJlbCA9IFBoeWxvX01peGVkU3Bpbm9zZSR0aXAubGFiZWwsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkgJT4lIGxlZnRfam9pbih0aXBfZGF0YSwgYnkgPSAibGFiZWwiKQoKIyBQbG90cwpwMSA8LSBnZ3RyZWUoUGh5bG9fTm9uU3Bpbm9zZU9ubHkpICU8KyUgUGh5bG9fTm9uU3Bpbm9zZU9ubHlfZGF0YSArCiAgZ2VvbV90aXBwb2ludChhZXMoY29sb3I9TW9ycGhvbG9neSksIHNpemU9MikgKwogIGdlb21fcm9vdGVkZ2UoKSArCiAgeGxpbV90cmVlKDgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiU3Bpbm9zZSIgPSAic2FsbW9uIiwgIk5vbi1zcGlub3NlIiA9ICJjeWFuMyIpKSArCiAgZ2VvbV90aXBsYWIoYWVzKGxhYmVsID0gTGFzdF9zcGVjaWVzKSwgc2l6ZT0yLCBoanVzdD0tMC4wNSkgKyAKICB0aGVtZV90cmVlMigpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImluc2lkZSIsIGxlZ2VuZC5wb3NpdGlvbi5pbnNpZGUgPSBjKDAuOCwwLjE1KSwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTMpKSArCiAgZ2d0aXRsZSgiQ2xhZGUgb2YgZXhjbHVzaXZlbHkgbm9uLXNwaW5vc2UgZm9yYW1pbmlmZXJhIikKCnAyIDwtIGdndHJlZShQaHlsb19TcGlub3NlT25seSkgJTwrJSBQaHlsb19TcGlub3NlT25seV9kYXRhICsKICBnZW9tX3RpcHBvaW50KGFlcyhjb2xvcj1Nb3JwaG9sb2d5KSwgc2l6ZT0yKSArCiAgZ2VvbV9yb290ZWRnZSgpICsKICB4bGltX3RyZWUoOCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJTcGlub3NlIiA9ICJzYWxtb24iLCAiTm9uLXNwaW5vc2UiID0gImN5YW4zIikpICsKICBnZW9tX3RpcGxhYihhZXMobGFiZWwgPSBMYXN0X3NwZWNpZXMpLCBzaXplPTIsIGhqdXN0PS0wLjA1KSArIAogIHRoZW1lX3RyZWUyKCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiaW5zaWRlIiwgbGVnZW5kLnBvc2l0aW9uLmluc2lkZSA9IGMoMC44LDAuMTUpLCBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMykpICsKICBnZ3RpdGxlKCJDbGFkZSBvZiBleGNsdXNpdmVseSBzcGlub3NlIGZvcmFtaW5pZmVyYSIpCgpwMyA8LSBnZ3RyZWUoUGh5bG9fTWl4ZWRTcGlub3NlKSAlPCslIFBoeWxvX01peGVkU3Bpbm9zZV9kYXRhICsKICBnZW9tX3RpcHBvaW50KGFlcyhjb2xvcj1Nb3JwaG9sb2d5KSwgc2l6ZT0yKSArCiAgZ2VvbV9yb290ZWRnZSgpICsKICB4bGltX3RyZWUoOCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJTcGlub3NlIiA9ICJzYWxtb24iLCAiTm9uLXNwaW5vc2UiID0gImN5YW4zIikpICsKICBnZW9tX3RpcGxhYihhZXMobGFiZWwgPSBMYXN0X3NwZWNpZXMpLCBzaXplPTIsIGhqdXN0PS0wLjA1KSArIAogIHRoZW1lX3RyZWUyKCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiaW5zaWRlIiwgbGVnZW5kLnBvc2l0aW9uLmluc2lkZSA9IGMoMC44LDAuOCksIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEzKSkgKwogIGdndGl0bGUoIkNsYWRlIG9mIG1peGVkIHNwaW5vc2UgYW5kIG5vbi1zcGlub3NlIGZvcmFtaW5pZmVyYSIpCgojIFByaW50IHRoZSBwbG90cwpyZXZ0cyhwMSkKcmV2dHMocDIpCnJldnRzKHAzKQpnZ3NhdmUoIi4uLy4uLzMtRGF0YV9wcm9jZXNzZWQvTW9ycGhvc3BlY2llc19waHlsb2dlbmllcy9JbWFnZXMvTm9uU3Bpbm9zZU9ubHlfcGh5bG9fd2FsbHRleHR1cmUucG5nIiwgcmV2dHMocDEpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA4KQpnZ3NhdmUoIi4uLy4uLzMtRGF0YV9wcm9jZXNzZWQvTW9ycGhvc3BlY2llc19waHlsb2dlbmllcy9JbWFnZXMvU3Bpbm9zZU9ubHlfcGh5bG9fd2FsbHRleHR1cmUucG5nIiwgcmV2dHMocDIpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA4KQpnZ3NhdmUoIi4uLy4uLzMtRGF0YV9wcm9jZXNzZWQvTW9ycGhvc3BlY2llc19waHlsb2dlbmllcy9JbWFnZXMvTWl4ZWRTcGlub3NlX3BoeWxvX3dhbGx0ZXh0dXJlLnBuZyIsIHJldnRzKHAzKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gOCkKYGBgCgpTYXZlIHNwbGl0IHRyZWVzCgpgYGB7cn0Kd3JpdGUudHJlZShQaHlsb19Ob25TcGlub3NlT25seSwgcGFzdGUwKCIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL01vcnBob3NwZWNpZXNfcGh5bG9nZW5pZXMvTm9uU3Bpbm9zZU9ubHkudHJlZSIpKQp3cml0ZS50cmVlKFBoeWxvX1NwaW5vc2VPbmx5LCBwYXN0ZTAoIi4uLy4uLzMtRGF0YV9wcm9jZXNzZWQvTW9ycGhvc3BlY2llc19waHlsb2dlbmllcy9TcGlub3NlT25seS50cmVlIikpCndyaXRlLnRyZWUoUGh5bG9fTWl4ZWRTcGlub3NlLCBwYXN0ZTAoIi4uLy4uLzMtRGF0YV9wcm9jZXNzZWQvTW9ycGhvc3BlY2llc19waHlsb2dlbmllcy9NaXhlZFNwaW5vc2UudHJlZSIpKQpgYGAKCiMjIElkZW0gb24gdGhlIHBoeWxvZ2VueSB3aXRoIHNhbXBsZWQgYW5jZXN0b3JzCgpgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5hc3A9MS4yfQpxIDwtIGdndHJlZShGb3JhbV9waHlsb19mb3NzaWxzKSAlPCslIHRpcF9kYXRhICsKICBnZW9tX3RpcHBvaW50KGFlcyhjb2xvcj1Nb3JwaG9sb2d5KSwgc2l6ZT0yKSArIAogIGdlb21fdGlwbGFiKGFlcyhsYWJlbCA9IExhc3Rfc3BlY2llcyksIHNpemU9MiwgaGp1c3Q9LTAuMDUpICsKICBnZW9tX25vZGVsYWIoc2l6ZT0xLCAKICAgICAgICAgICAgICAgbnVkZ2VfeT1hcy5udW1lcmljKGxpc3QoIkZBTFNFIj0wLCJUUlVFIj0wLjUpW2FzLmNoYXJhY3RlcihncmVwbCgiRiIsYyhGb3JhbV9waHlsb19mb3NzaWxzJG5vZGUubGFiZWwpKSldKSwgCiAgICAgICAgICAgICAgIGNvbG91cj1hcy5jaGFyYWN0ZXIobGlzdCgiRkFMU0UiPSdibGFjaycsIlRSVUUiPSJyZWQiKVthcy5jaGFyYWN0ZXIoZ3JlcGwoIkYiLGMoRm9yYW1fcGh5bG9fZm9zc2lscyRub2RlLmxhYmVsKSkpXSkpICsgCiAgeGxpbV90cmVlKDYpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiU3Bpbm9zZSIgPSAic2FsbW9uIiwgIk5vbi1zcGlub3NlIiA9ICJjeWFuMyIpKSArCiAgdGhlbWVfdHJlZTIoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJpbnNpZGUiLCBsZWdlbmQucG9zaXRpb24uaW5zaWRlID0gYygwLjgsMC42KSwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTMpKQoKZ2dzYXZlKCIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL01vcnBob3NwZWNpZXNfcGh5bG9nZW5pZXMvSW1hZ2VzL0ZvcmFtX3BoeWxvX3NhbXBsZWRBbmNlc3RvcnNfd2FsbHRleHR1cmUucG5nIiwgcmV2dHMocSksIHdpZHRoID0gMTIsIGhlaWdodCA9IDE0KQpyZXZ0cyhxKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0xNSwgZmlnLmFzcD0wLjh9Cm5vZGVfTm9uU3Bpbm9zZU9ubHkgPC0gIk4xOTgiCm5vZGVfU3Bpbm9zZU9ubHkgPC0gIk4yNTciCm5vZGVfTWl4ZWRTcGlub3NlIDwtICJOMTgyIgoKIyBFeHRyYWN0IG9uZSBjbGFkZSBmcm9tIHRoYXQgbm9kZQpQaHlsb19Ob25TcGlub3NlT25seV9zYW1wbGVkQW5jZXN0b3JzIDwtIGV4dHJhY3QuY2xhZGUoRm9yYW1fcGh5bG9fZm9zc2lscywgbm9kZSA9IG5vZGVfTm9uU3Bpbm9zZU9ubHksIHJvb3QuZWRnZSA9IDEsIGNvbGxhcHNlLnNpbmdsZXMgPSBGKQpQaHlsb19TcGlub3NlT25seV9zYW1wbGVkQW5jZXN0b3JzIDwtIGV4dHJhY3QuY2xhZGUoRm9yYW1fcGh5bG9fZm9zc2lscywgbm9kZSA9IG5vZGVfU3Bpbm9zZU9ubHksIHJvb3QuZWRnZSA9IDEsIGNvbGxhcHNlLnNpbmdsZXMgPSBGKQpQaHlsb19NaXhlZFNwaW5vc2Vfc2FtcGxlZEFuY2VzdG9ycyA8LSBleHRyYWN0LmNsYWRlKEZvcmFtX3BoeWxvX2Zvc3NpbHMsIG5vZGUgPSBub2RlX01peGVkU3Bpbm9zZSwgcm9vdC5lZGdlID0gMywgY29sbGFwc2Uuc2luZ2xlcyA9IEYpCgojIEFkZCBtb3JwaG9sb2dpY2FsIGluZm9ybWF0aW9uClBoeWxvX05vblNwaW5vc2VPbmx5X3NhbXBsZWRBbmNlc3RvcnNfZGF0YSA8LSAgZGF0YS5mcmFtZShsYWJlbCA9IFBoeWxvX05vblNwaW5vc2VPbmx5X3NhbXBsZWRBbmNlc3RvcnMkdGlwLmxhYmVsLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpICU+JSBsZWZ0X2pvaW4odGlwX2RhdGEsIGJ5ID0gImxhYmVsIikKUGh5bG9fU3Bpbm9zZU9ubHlfc2FtcGxlZEFuY2VzdG9yc19kYXRhIDwtIGRhdGEuZnJhbWUobGFiZWwgPSBQaHlsb19TcGlub3NlT25seV9zYW1wbGVkQW5jZXN0b3JzJHRpcC5sYWJlbCwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKSAlPiUgbGVmdF9qb2luKHRpcF9kYXRhLCBieSA9ICJsYWJlbCIpClBoeWxvX01peGVkU3Bpbm9zZV9zYW1wbGVkQW5jZXN0b3JzX2RhdGEgPC0gZGF0YS5mcmFtZShsYWJlbCA9IFBoeWxvX01peGVkU3Bpbm9zZV9zYW1wbGVkQW5jZXN0b3JzJHRpcC5sYWJlbCwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKSAlPiUgbGVmdF9qb2luKHRpcF9kYXRhLCBieSA9ICJsYWJlbCIpCgojIFBsb3RzCnAxIDwtIGdndHJlZShQaHlsb19Ob25TcGlub3NlT25seV9zYW1wbGVkQW5jZXN0b3JzKSAlPCslIFBoeWxvX05vblNwaW5vc2VPbmx5X3NhbXBsZWRBbmNlc3RvcnNfZGF0YSArCiAgZ2VvbV90aXBwb2ludChhZXMoY29sb3I9TW9ycGhvbG9neSksIHNpemU9MikgKwogIHhsaW1fdHJlZSg4KSArCiAgZ2VvbV9yb290ZWRnZSgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiU3Bpbm9zZSIgPSAic2FsbW9uIiwgIk5vbi1zcGlub3NlIiA9ICJjeWFuMyIpKSArCiAgZ2VvbV90aXBsYWIoYWVzKGxhYmVsID0gTGFzdF9zcGVjaWVzKSwgc2l6ZT0zLCBoanVzdD0tMC4wNSkgKwogIGdlb21fbm9kZWxhYihzaXplPTIsIAogICAgICAgICAgICAgICBudWRnZV95PWFzLm51bWVyaWMobGlzdCgiRkFMU0UiPTAsIlRSVUUiPTAuMilbYXMuY2hhcmFjdGVyKGdyZXBsKCJGIixjKFBoeWxvX05vblNwaW5vc2VPbmx5X3NhbXBsZWRBbmNlc3RvcnMkbm9kZS5sYWJlbCkpKV0pLCAKICAgICAgICAgICAgICAgY29sb3VyPWFzLmNoYXJhY3RlcihsaXN0KCJGQUxTRSI9J2JsYWNrJywiVFJVRSI9InJlZCIpW2FzLmNoYXJhY3RlcihncmVwbCgiRiIsYyhQaHlsb19Ob25TcGlub3NlT25seV9zYW1wbGVkQW5jZXN0b3JzJG5vZGUubGFiZWwpKSldKSkgKyAKICB0aGVtZV90cmVlMigpICsKICBnZ3RpdGxlKCJDbGFkZSBvZiBleGNsdXNpdmVseSBub24tc3Bpbm9zZSBmb3JhbWluaWZlcmEiKQoKcDIgPC0gZ2d0cmVlKFBoeWxvX1NwaW5vc2VPbmx5X3NhbXBsZWRBbmNlc3RvcnMpICU8KyUgUGh5bG9fU3Bpbm9zZU9ubHlfc2FtcGxlZEFuY2VzdG9yc19kYXRhICsKICBnZW9tX3RpcHBvaW50KGFlcyhjb2xvcj1Nb3JwaG9sb2d5KSwgc2l6ZT0yKSArCiAgZ2VvbV9yb290ZWRnZSgpICsKICB4bGltX3RyZWUoOCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJTcGlub3NlIiA9ICJzYWxtb24iLCAiTm9uLXNwaW5vc2UiID0gImN5YW4zIikpICsKICBnZW9tX3RpcGxhYihhZXMobGFiZWwgPSBMYXN0X3NwZWNpZXMpLCBzaXplPTMsIGhqdXN0PS0wLjA1KSArIAogIGdlb21fbm9kZWxhYihzaXplPTIsIAogICAgICAgICAgICAgICBudWRnZV95PWFzLm51bWVyaWMobGlzdCgiRkFMU0UiPTAsIlRSVUUiPTAuMilbYXMuY2hhcmFjdGVyKGdyZXBsKCJGIixjKFBoeWxvX1NwaW5vc2VPbmx5X3NhbXBsZWRBbmNlc3RvcnMkbm9kZS5sYWJlbCkpKV0pLCAKICAgICAgICAgICAgICAgY29sb3VyPWFzLmNoYXJhY3RlcihsaXN0KCJGQUxTRSI9J2JsYWNrJywiVFJVRSI9InJlZCIpW2FzLmNoYXJhY3RlcihncmVwbCgiRiIsYyhQaHlsb19TcGlub3NlT25seV9zYW1wbGVkQW5jZXN0b3JzJG5vZGUubGFiZWwpKSldKSkgKyAKICB0aGVtZV90cmVlMigpICsKICB0aGVtZV90cmVlMigpICsKICBnZ3RpdGxlKCJDbGFkZSBvZiBleGNsdXNpdmVseSBzcGlub3NlIGZvcmFtaW5pZmVyYSIpCgpwMyA8LSBnZ3RyZWUoUGh5bG9fTWl4ZWRTcGlub3NlX3NhbXBsZWRBbmNlc3RvcnMpICU8KyUgUGh5bG9fTWl4ZWRTcGlub3NlX3NhbXBsZWRBbmNlc3RvcnNfZGF0YSArCiAgZ2VvbV90aXBwb2ludChhZXMoY29sb3I9TW9ycGhvbG9neSksIHNpemU9MikgKwogIGdlb21fcm9vdGVkZ2UoKSArCiAgeGxpbV90cmVlKDgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiU3Bpbm9zZSIgPSAic2FsbW9uIiwgIk5vbi1zcGlub3NlIiA9ICJjeWFuMyIpKSArCiAgZ2VvbV90aXBsYWIoYWVzKGxhYmVsID0gTGFzdF9zcGVjaWVzKSwgc2l6ZT0zLCBoanVzdD0tMC4wNSkgKyAKICBnZW9tX25vZGVsYWIoc2l6ZT0yLCAKICAgICAgICAgICAgICAgbnVkZ2VfeT1hcy5udW1lcmljKGxpc3QoIkZBTFNFIj0wLCJUUlVFIj0wLjIpW2FzLmNoYXJhY3RlcihncmVwbCgiRiIsYyhQaHlsb19NaXhlZFNwaW5vc2Vfc2FtcGxlZEFuY2VzdG9ycyRub2RlLmxhYmVsKSkpXSksIAogICAgICAgICAgICAgICBjb2xvdXI9YXMuY2hhcmFjdGVyKGxpc3QoIkZBTFNFIj0nYmxhY2snLCJUUlVFIj0icmVkIilbYXMuY2hhcmFjdGVyKGdyZXBsKCJGIixjKFBoeWxvX01peGVkU3Bpbm9zZV9zYW1wbGVkQW5jZXN0b3JzJG5vZGUubGFiZWwpKSldKSkgKyAKICB0aGVtZV90cmVlMigpICsKICB0aGVtZV90cmVlMigpICsKICBnZ3RpdGxlKCJDbGFkZSBvZiBtaXhlZCBzcGlub3NlIGFuZCBub24tc3Bpbm9zZSBmb3JhbWluaWZlcmEiKQoKIyBQcmludCB0aGUgcGxvdHMKcmV2dHMocDEpCnJldnRzKHAyKQpyZXZ0cyhwMykKZ2dzYXZlKCIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL01vcnBob3NwZWNpZXNfcGh5bG9nZW5pZXMvSW1hZ2VzL05vblNwaW5vc2VPbmx5X3NhbXBsZWRBbmNlc3RvcnNfcGh5bG9fd2FsbHRleHR1cmUucG5nIiwgcmV2dHMocDEpLCB3aWR0aCA9IDE1LCBoZWlnaHQgPSAxMikKZ2dzYXZlKCIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL01vcnBob3NwZWNpZXNfcGh5bG9nZW5pZXMvSW1hZ2VzL1NwaW5vc2VPbmx5X3NhbXBsZWRBbmNlc3RvcnNfcGh5bG9fd2FsbHRleHR1cmUucG5nIiwgcmV2dHMocDIpLCB3aWR0aCA9IDE1LCBoZWlnaHQgPSAxMikKZ2dzYXZlKCIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL01vcnBob3NwZWNpZXNfcGh5bG9nZW5pZXMvSW1hZ2VzL01peGVkU3Bpbm9zZV9zYW1wbGVkQW5jZXN0b3JzX3BoeWxvX3dhbGx0ZXh0dXJlLnBuZyIsIHJldnRzKHAzKSwgd2lkdGggPSAxNSwgaGVpZ2h0ID0gMTIpCmBgYAoKU2F2ZSBzcGxpdCB0cmVlcwoKYGBge3J9CndyaXRlLnRyZWUoUGh5bG9fTm9uU3Bpbm9zZU9ubHlfc2FtcGxlZEFuY2VzdG9ycywgcGFzdGUwKCIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL01vcnBob3NwZWNpZXNfcGh5bG9nZW5pZXMvTm9uU3Bpbm9zZU9ubHlfc2FtcGxlZEFuY2VzdG9ycy50cmVlIikpCndyaXRlLnRyZWUoUGh5bG9fU3Bpbm9zZU9ubHlfc2FtcGxlZEFuY2VzdG9ycywgcGFzdGUwKCIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL01vcnBob3NwZWNpZXNfcGh5bG9nZW5pZXMvU3Bpbm9zZU9ubHlfc2FtcGxlZEFuY2VzdG9ycy50cmVlIikpCndyaXRlLnRyZWUoUGh5bG9fTWl4ZWRTcGlub3NlX3NhbXBsZWRBbmNlc3RvcnMsIHBhc3RlMCgiLi4vLi4vMy1EYXRhX3Byb2Nlc3NlZC9Nb3JwaG9zcGVjaWVzX3BoeWxvZ2VuaWVzL01peGVkU3Bpbm9zZV9zYW1wbGVkQW5jZXN0b3JzLnRyZWUiKSkKYGBgCgojIFNhdmUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcwoKVGFrZSB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBtb3JwaG9sb2dpY2FsIHRheG9ub215IGFuZCB0aGUgc3Vic2FtcGxlZCBkYXRhc2V0CgpgYGB7cn0KZ2V0X2dlbmVyYSA8LSBmdW5jdGlvbih0cmVlLCBhbmNlc3RyeV90YWJsZSl7CiAgc3BlY2llc19sYWJlbHMgPC0gYyh0cmVlJG5vZGUubGFiZWwsIHRyZWUkdGlwLmxhYmVsKQogIHNwZWNpZXMgPC0gc2FwcGx5KHNwZWNpZXNfbGFiZWxzLCBmdW5jdGlvbihjb2RlKXNhcHBseShhbmNlc3RyeV90YWJsZVthbmNlc3RyeV90YWJsZSRgTGluZWFnZSBjb2RlYCA9PSBjb2RlLCAiU3BlY2llcyBpbiBsaW5lYWdlIl0sIHN0cnNwbGl0LCBzcGxpdCA9ICItIikpCiAgdW5pcXVlKGdzdWIoIiAuKiIsICIiLCB1bmxpc3Qoc3BlY2llcykpKQogICN1bmlxdWUodW5saXN0KHNwZWNpZXMpKQp9ClBoeWxvX05vblNwaW5vc2VPbmx5X0dlbmVyYSA8LSBnZXRfZ2VuZXJhKFBoeWxvX05vblNwaW5vc2VPbmx5X3NhbXBsZWRBbmNlc3RvcnMsIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9mb3NzaWxzKQpQaHlsb19TcGlub3NlT25seV9HZW5lcmEgPC0gZ2V0X2dlbmVyYShQaHlsb19TcGlub3NlT25seV9zYW1wbGVkQW5jZXN0b3JzLCBGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfZm9zc2lscykKUGh5bG9fTWl4ZWRTcGlub3NlX0dlbmVyYSA8LSBnZXRfZ2VuZXJhKFBoeWxvX01peGVkU3Bpbm9zZV9zYW1wbGVkQW5jZXN0b3JzLCBGb3JhbV9hbmNlc3RyeV90YWJsZV9hbGJfZm9zc2lscykKCkZvcmFtX3BoeWxvX0dlbmVyYSA8LSBnZXRfZ2VuZXJhKEZvcmFtX3BoeWxvX2Zvc3NpbHMsIEZvcmFtX2FuY2VzdHJ5X3RhYmxlX2FsYl9mb3NzaWxzKQpgYGAKCkF2b2lkIG92ZXJsYXBzIGJ5IHJlbW92aW5nIGdlbmVyYSB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSB3cm9uZyBjbGFkZSBkdWUgdG8gb25lIG1pc3BsYWNlZCBzcGVjaWVzIChyZXNwLiAiUGFyYWdsb2Jvcm90YWxpYSBjb250aW51b3NhIiwgIlBhcmFzdWJib3RpbmEgaGFnbmkiIGFuZCAiR2xvYm9yb3RhbGlhIGJlbGxhIikKCmBgYHtyfQpQaHlsb19Ob25TcGlub3NlT25seV9HZW5lcmEgPC0gUGh5bG9fTm9uU3Bpbm9zZU9ubHlfR2VuZXJhWyFncmVwbCgiUGFyYWdsb2Jvcm90YWxpYSIsIFBoeWxvX05vblNwaW5vc2VPbmx5X0dlbmVyYSldClBoeWxvX1NwaW5vc2VPbmx5X0dlbmVyYSA8LSBQaHlsb19TcGlub3NlT25seV9HZW5lcmFbIWdyZXBsKCJQYXJhc3ViYm90aW5hIiwgUGh5bG9fU3Bpbm9zZU9ubHlfR2VuZXJhKV0KUGh5bG9fTWl4ZWRTcGlub3NlX0dlbmVyYSA8LSBQaHlsb19NaXhlZFNwaW5vc2VfR2VuZXJhWyFncmVwbCgiR2xvYm9yb3RhbGlhIiwgUGh5bG9fTWl4ZWRTcGlub3NlX0dlbmVyYSldCgppbnRlcnNlY3QoUGh5bG9fTm9uU3Bpbm9zZU9ubHlfR2VuZXJhLCBQaHlsb19TcGlub3NlT25seV9HZW5lcmEpCmludGVyc2VjdChQaHlsb19Ob25TcGlub3NlT25seV9HZW5lcmEsIFBoeWxvX01peGVkU3Bpbm9zZV9HZW5lcmEpCmludGVyc2VjdChQaHlsb19TcGlub3NlT25seV9HZW5lcmEsIFBoeWxvX01peGVkU3Bpbm9zZV9HZW5lcmEpCmBgYAoKUmVtYWluaW5nIHN0ZW0gZ2VuZXJhLCBhcyBleHBlY3RlZAoKYGBge3J9ClBoeWxvX1N0ZW1fR2VuZXJhIDwtIEZvcmFtX3BoeWxvX0dlbmVyYVshRm9yYW1fcGh5bG9fR2VuZXJhICVpbiUgYyhQaHlsb19Ob25TcGlub3NlT25seV9HZW5lcmEsIFBoeWxvX1NwaW5vc2VPbmx5X0dlbmVyYSwgUGh5bG9fTWl4ZWRTcGlub3NlX0dlbmVyYSldClBoeWxvX1N0ZW1fR2VuZXJhCmBgYAoKQWRkIEhhc3RpZ2VyaW5pZGFlIGdlbmVyYSAoSGFzdGlnZXJpbmEsIEhhc3RpZ2VyaW5lbGxhIGFuZCBPcmNhZGlhKSBpbiB0aGUgU3Bpbm9zZSBvbmx5IGNsYWRlLCBnaXZlbiB0aGF0IHRoZXkgYXJlIHRob3VnaHQgdG8gaGF2ZSBldm9sdmVkIGZyb20gR2xvYmlnZXJpbmVsbGEgKGh0dHBzOi8vd3d3Lm1pa3JvdGF4Lm9yZy9OYW5ub3RheDMvaW5kZXgucGhwP21vZHVsZT1wZl9jZW5vem9pYyZ0YXhvbj1IYXN0aWdlcmluaWRhZSkKCmBgYHtyfQpQaHlsb19TcGlub3NlT25seV9HZW5lcmEgPC0gYyhQaHlsb19TcGlub3NlT25seV9HZW5lcmEsICJIYXN0aWdlcmluYSIsICJIYXN0aWdlcmluZWxsYSIsICJPcmNhZGlhIikKCndhbGxfdGV4dHVyZXNbIXdhbGxfdGV4dHVyZXMkTW9ycGhvbG9neSAlaW4lIGMoIk1pY3JvcGVyZm9yYXRlIiwgIkluZGVwZW5kZW50IikgJiAhd2FsbF90ZXh0dXJlcyRHZW51cyAlaW4lIGMoUGh5bG9fTm9uU3Bpbm9zZU9ubHlfR2VuZXJhLCBQaHlsb19TcGlub3NlT25seV9HZW5lcmEsIFBoeWxvX01peGVkU3Bpbm9zZV9HZW5lcmEsIFBoeWxvX1N0ZW1fR2VuZXJhKSxdCmBgYAoKYGBge3J9CnRyaXRvbi5zcyRnZW51cyA8LSBnc3ViKCIgLioiLCAiIiwgdHJpdG9uLnNzJHNwZWNpZXMpCmBgYAoKIyMgU3Bpbm9zZSBvbmx5CgpgYGB7cn0KdHJpdG9uLnNzLlNwaW5vc2VPbmx5IDwtIHRyaXRvbi5zc1t0cml0b24uc3MkZ2VudXMgJWluJSBQaHlsb19TcGlub3NlT25seV9HZW5lcmEsIGMoInNwZWNpZXMiLCAiU3BlY2lhdGlvbiIsICJFeHRpbmN0aW9uIiwgImFnZV9ydW5pZiIpXQpuYW1lcyh0cml0b24uc3MuU3Bpbm9zZU9ubHkpIDwtIGMoInRheG9uIiwgIlNwZWNpYXRpb24iLCAiRXh0aW5jdGlvbiIsICJhZ2UiKQp0cml0b24uc3MuU3Bpbm9zZU9ubHkkdGF4b24gPC0gcGFzdGUodHJpdG9uLnNzLlNwaW5vc2VPbmx5JHRheG9uLCAiSWEiKQp0cml0b24uc3MuU3Bpbm9zZU9ubHkkdGF4b24gPC0gZ3N1YigiICIsICJfIiwgdHJpdG9uLnNzLlNwaW5vc2VPbmx5JHRheG9uKQp0cml0b24uc3MuU3Bpbm9zZU9ubHkKYGBgCgojIyBOb24tc3Bpbm9zZSBvbmx5CgpgYGB7cn0KdHJpdG9uLnNzLk5vblNwaW5vc2VPbmx5IDwtIHRyaXRvbi5zc1t0cml0b24uc3MkZ2VudXMgJWluJSBQaHlsb19Ob25TcGlub3NlT25seV9HZW5lcmEsIGMoInNwZWNpZXMiLCAiU3BlY2lhdGlvbiIsICJFeHRpbmN0aW9uIiwgImFnZV9ydW5pZiIpXQpuYW1lcyh0cml0b24uc3MuTm9uU3Bpbm9zZU9ubHkpIDwtIGMoInRheG9uIiwgIlNwZWNpYXRpb24iLCAiRXh0aW5jdGlvbiIsICJhZ2UiKQp0cml0b24uc3MuTm9uU3Bpbm9zZU9ubHkkdGF4b24gPC0gcGFzdGUodHJpdG9uLnNzLk5vblNwaW5vc2VPbmx5JHRheG9uLCAiSWEiKQp0cml0b24uc3MuTm9uU3Bpbm9zZU9ubHkkdGF4b24gPC0gZ3N1YigiICIsICJfIiwgdHJpdG9uLnNzLk5vblNwaW5vc2VPbmx5JHRheG9uKQp0cml0b24uc3MuTm9uU3Bpbm9zZU9ubHkKYGBgCgojIyBNaXhlZCBzcGlub3NlCgpgYGB7cn0KdHJpdG9uLnNzLk1peGVkU3Bpbm9zZSA8LSB0cml0b24uc3NbdHJpdG9uLnNzJGdlbnVzICVpbiUgUGh5bG9fTWl4ZWRTcGlub3NlX0dlbmVyYSwgYygic3BlY2llcyIsICJTcGVjaWF0aW9uIiwgIkV4dGluY3Rpb24iLCAiYWdlX3J1bmlmIildCm5hbWVzKHRyaXRvbi5zcy5NaXhlZFNwaW5vc2UpIDwtIGMoInRheG9uIiwgIlNwZWNpYXRpb24iLCAiRXh0aW5jdGlvbiIsICJhZ2UiKQp0cml0b24uc3MuTWl4ZWRTcGlub3NlJHRheG9uIDwtIHBhc3RlKHRyaXRvbi5zcy5NaXhlZFNwaW5vc2UkdGF4b24sICJJYSIpCnRyaXRvbi5zcy5NaXhlZFNwaW5vc2UkdGF4b24gPC0gZ3N1YigiICIsICJfIiwgdHJpdG9uLnNzLk1peGVkU3Bpbm9zZSR0YXhvbikKdHJpdG9uLnNzLk1peGVkU3Bpbm9zZQpgYGAKCiMjIENvbXBhcmUgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyB3aXRoIHRoZSBudW1iZXIgb2YgbGluZWFnZXMgZnJvbSBleHBlcnRzCgpgYGB7ciBmaWcuYXNwPTAuMywgZmlnLndpZHRoPTEyfQp0aW1lX3BvaW50cyA8LSAwOjEzMi8yCk9UVC5zcy5TcGlub3NlT25seSA8LSBzYXBwbHkodGltZV9wb2ludHMsIGZ1bmN0aW9uKHRpKXN1bShhYnModHJpdG9uLnNzLlNwaW5vc2VPbmx5JGFnZSAtIHRpKSA8PSBkaWZmKHRpbWVfcG9pbnRzKVsxXS8yKSkKZXhwZXJ0TFRULnNzLlNwaW5vc2VPbmx5IDwtIHNhcHBseSh0aW1lX3BvaW50cywgZnVuY3Rpb24odGkpbGVuZ3RoKHVuaXF1ZSh0cml0b24uc3MuU3Bpbm9zZU9ubHlbdHJpdG9uLnNzLlNwaW5vc2VPbmx5JFNwZWNpYXRpb24gPj0gdGkgJiB0aSA+PSB0cml0b24uc3MuU3Bpbm9zZU9ubHkkRXh0aW5jdGlvbixdJHRheG9uKSkpCmVtcGlyaWNhbExUVC5zcy5TcGlub3NlT25seSA8LSBzYXBwbHkodGltZV9wb2ludHMsIGZ1bmN0aW9uKHRpKWxlbmd0aCh1bmlxdWUodHJpdG9uLnNzLlNwaW5vc2VPbmx5W2Ficyh0cml0b24uc3MuU3Bpbm9zZU9ubHkkYWdlIC0gdGkpIDw9IGRpZmYodGltZV9wb2ludHMpWzFdLzIsXSR0YXhvbikpKQoKT1RULnNzLk5vblNwaW5vc2VPbmx5IDwtIHNhcHBseSh0aW1lX3BvaW50cywgZnVuY3Rpb24odGkpc3VtKGFicyh0cml0b24uc3MuTm9uU3Bpbm9zZU9ubHkkYWdlIC0gdGkpIDw9IGRpZmYodGltZV9wb2ludHMpWzFdLzIpKQpleHBlcnRMVFQuc3MuTm9uU3Bpbm9zZU9ubHkgPC0gc2FwcGx5KHRpbWVfcG9pbnRzLCBmdW5jdGlvbih0aSlsZW5ndGgodW5pcXVlKHRyaXRvbi5zcy5Ob25TcGlub3NlT25seVt0cml0b24uc3MuTm9uU3Bpbm9zZU9ubHkkU3BlY2lhdGlvbiA+PSB0aSAmIHRpID49IHRyaXRvbi5zcy5Ob25TcGlub3NlT25seSRFeHRpbmN0aW9uLF0kdGF4b24pKSkKZW1waXJpY2FsTFRULnNzLk5vblNwaW5vc2VPbmx5IDwtIHNhcHBseSh0aW1lX3BvaW50cywgZnVuY3Rpb24odGkpbGVuZ3RoKHVuaXF1ZSh0cml0b24uc3MuTm9uU3Bpbm9zZU9ubHlbYWJzKHRyaXRvbi5zcy5Ob25TcGlub3NlT25seSRhZ2UgLSB0aSkgPD0gZGlmZih0aW1lX3BvaW50cylbMV0vMixdJHRheG9uKSkpCgpPVFQuc3MuTWl4ZWRTcGlub3NlIDwtIHNhcHBseSh0aW1lX3BvaW50cywgZnVuY3Rpb24odGkpc3VtKGFicyh0cml0b24uc3MuTWl4ZWRTcGlub3NlJGFnZSAtIHRpKSA8PSBkaWZmKHRpbWVfcG9pbnRzKVsxXS8yKSkKZXhwZXJ0TFRULnNzLk1peGVkU3Bpbm9zZSA8LSBzYXBwbHkodGltZV9wb2ludHMsIGZ1bmN0aW9uKHRpKWxlbmd0aCh1bmlxdWUodHJpdG9uLnNzLk1peGVkU3Bpbm9zZVt0cml0b24uc3MuTWl4ZWRTcGlub3NlJFNwZWNpYXRpb24gPj0gdGkgJiB0aSA+PSB0cml0b24uc3MuTWl4ZWRTcGlub3NlJEV4dGluY3Rpb24sXSR0YXhvbikpKQplbXBpcmljYWxMVFQuc3MuTWl4ZWRTcGlub3NlIDwtIHNhcHBseSh0aW1lX3BvaW50cywgZnVuY3Rpb24odGkpbGVuZ3RoKHVuaXF1ZSh0cml0b24uc3MuTWl4ZWRTcGlub3NlW2Ficyh0cml0b24uc3MuTWl4ZWRTcGlub3NlJGFnZSAtIHRpKSA8PSBkaWZmKHRpbWVfcG9pbnRzKVsxXS8yLF0kdGF4b24pKSkKCnBhcihtZnJvdz1jKDEsMykpCnBsb3QodGltZV9wb2ludHMsIE9UVC5zcy5TcGlub3NlT25seS8xNSwgdHlwZT0icCIsIHlsaW09YygwLDUwKSwgeGxhYiA9ICJUaW1lIChNeWEpIiwgeWxhYj0iTnVtYmVyIG9mIG9jY3VyZW5jZXMgKHgyMCkiLCBtYWluID0gIkNvcnJlc3BvbmRhbmNlIGJldHdlZW4gb2NjdXJyZW5jZXMgYW5kIExUVCAoUyBvbmx5KSIpCmxpbmVzKHRpbWVfcG9pbnRzLCBleHBlcnRMVFQuc3MuU3Bpbm9zZU9ubHksIGx3ZD0zLCBjb2w9Z2dwbG90Mjo6YWxwaGEoInB1cnBsZSIsIDAuNSkpCgpwbG90KHRpbWVfcG9pbnRzLCBPVFQuc3MuTm9uU3Bpbm9zZU9ubHkvMTUsIHR5cGU9InAiLCB5bGltPWMoMCw1MCksIHhsYWIgPSAiVGltZSAoTXlhKSIsIHlsYWI9Ik51bWJlciBvZiBvY2N1cmVuY2VzICh4MjApIiwgbWFpbiA9ICJDb3JyZXNwb25kYW5jZSBiZXR3ZWVuIG9jY3VycmVuY2VzIGFuZCBMVFQgKE5TIG9ubHkpIikKbGluZXModGltZV9wb2ludHMsIGV4cGVydExUVC5zcy5Ob25TcGlub3NlT25seSwgbHdkPTMsIGNvbD1nZ3Bsb3QyOjphbHBoYSgicHVycGxlIiwgMC41KSkKCnBsb3QodGltZV9wb2ludHMsIE9UVC5zcy5NaXhlZFNwaW5vc2UvMTUsIHR5cGU9InAiLCB5bGltPWMoMCw1MCksIHhsYWIgPSAiVGltZSAoTXlhKSIsIHlsYWI9Ik51bWJlciBvZiBvY2N1cmVuY2VzICh4MjApIiwgbWFpbiA9ICJDb3JyZXNwb25kYW5jZSBiZXR3ZWVuIG9jY3VycmVuY2VzIGFuZCBMVFQgKE1peGVkKSIpCmxpbmVzKHRpbWVfcG9pbnRzLCBleHBlcnRMVFQuc3MuTWl4ZWRTcGlub3NlLCBsd2Q9MywgY29sPWdncGxvdDI6OmFscGhhKCJwdXJwbGUiLCAwLjUpKQpgYGAKCiMjIFNhdmUgb2NjdXJyZW5jZXMgKG5vIHRheG9ub21pYyBpbmZvcm1hdGlvbikKCmBgYHtyfQp3cml0ZS50YWJsZSh0KHRyaXRvbi5zcy5TcGlub3NlT25seSRhZ2UpLCAKICAgICAgICAgICAgZmlsZSA9IHBhc3RlMCgiLi4vLi4vMy1EYXRhX3Byb2Nlc3NlZC9Ucml0b25fb2NjdXJyZW5jZXMvVHJpdG9uREJfc3Vic2FtcGxlZF9TVFRfIiwgbGVuZ3RoKHRyaXRvbi5zcy5TcGlub3NlT25seSRhZ2UpLCJvY2N1cnJlbmNlc19TcGlub3NlT25seS5jc3YiKSwgCiAgICAgICAgICAgIHNlcD0iOyIsIHF1b3RlPUYsIHJvdy5uYW1lcz1GLCBjb2wubmFtZXM9RikKCndyaXRlLnRhYmxlKHQodHJpdG9uLnNzLk5vblNwaW5vc2VPbmx5JGFnZSksIAogICAgICAgICAgICBmaWxlID0gcGFzdGUwKCIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL1RyaXRvbl9vY2N1cnJlbmNlcy9Ucml0b25EQl9zdWJzYW1wbGVkX1NUVF8iLCBsZW5ndGgodHJpdG9uLnNzLk5vblNwaW5vc2VPbmx5JGFnZSksIm9jY3VycmVuY2VzX05vblNwaW5vc2VPbmx5LmNzdiIpLCAKICAgICAgICAgICAgc2VwPSI7IiwgcXVvdGU9Riwgcm93Lm5hbWVzPUYsIGNvbC5uYW1lcz1GKQoKd3JpdGUudGFibGUodCh0cml0b24uc3MuTWl4ZWRTcGlub3NlJGFnZSksIAogICAgICAgICAgICBmaWxlID0gcGFzdGUwKCIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL1RyaXRvbl9vY2N1cnJlbmNlcy9Ucml0b25EQl9zdWJzYW1wbGVkX1NUVF8iLCBsZW5ndGgodHJpdG9uLnNzLk1peGVkU3Bpbm9zZSRhZ2UpLCJvY2N1cnJlbmNlc19NaXhlZFNwaW5vc2UuY3N2IiksIAogICAgICAgICAgICBzZXA9IjsiLCBxdW90ZT1GLCByb3cubmFtZXM9RiwgY29sLm5hbWVzPUYpCmBgYAoK